<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml" lang="en">

<head>
  <link href='https://fonts.googleapis.com/css?family=Inconsolata' rel='stylesheet' type='text/css' /><title>Transactions &mdash; MongoDB Manual</title><link rel="shortcut icon" href="https://media.mongodb.org/favicon.ico" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="robots" content="index" />

  <meta name="release" content="4.2.5"/>
  <meta name="version" content="4.2"/>
  <meta name="DC.Source" content="https://github.com/mongodb/docs/blob/v4.2/source/core/transactions.txt"/>
  <meta property="og:image" content="http://s3.amazonaws.com/info-mongodb-com/_com_assets/cms/mongodb-for-giant-ideas-bbab5c3cf8.png">
  <meta property="og:image:secure_url" content="https://webassets.mongodb.com/_com_assets/cms/mongodb-for-giant-ideas-bbab5c3cf8.png">
      <link rel="canonical" href="https://docs.mongodb.com/manual/core/transactions" /><meta content="For situations that require atomicity of reads and writes to multiple documents (in a single or multiple collections), MongoDB supports multi-document transactions." name="description" />
<meta content="MongoDB, transactions, distributed transactions, MongoDB multi-document transactions, MongoDB multi-statement transactions, java transaction examples, python transaction examples, node transaction examples, php transaction examples, scala transaction examples, csharp transaction examples, perl transaction examples, ruby transaction examples" name="keywords" />

  
   <link rel="stylesheet" href="../_static/mongodb-docs.css" type="text/css" />
   <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
   <link rel="stylesheet" href="../_static/css/navbar.min.css" type="text/css" />
    
    <script type="text/javascript" src="../_static/lib/jquery.min.js"></script>
    <script type="text/javascript" src="../_static/underscore.js"></script>
    <script type="text/javascript" src="../_static/lib/bootstrap.js"></script>
    <script type="text/javascript" src="../_static/lib/jquery.cookie.js"></script>
    <script type="text/javascript" src="../_static/controller.js"></script>
      <link rel="search" type="application/opensearchdescription+xml" href="https://docs.mongodb.com/osd.xml" title="MongoDB Help"/>
<link rel="author" title="About these documents" href="../about.html" />
<!-- <link rel="index" title="Index" href="../genindex.html" /> -->
<link rel="search" title="Search" href="../search.html" />
<link rel="top" title="MongoDB Manual" href="../index.html" />
<link rel="next" title="Drivers API" href="transactions-in-applications.html" />
<link rel="prev" title="Database References" href="../reference/database-references.html" /><script type='text/javascript'>
   var gptadslots=[];
   var googletag = googletag || {};
   googletag.cmd = googletag.cmd || [];
   (function(){ var gads = document.createElement('script');
      gads.async = true; gads.type = 'text/javascript';
      var useSSL = 'https:' == document.location.protocol;
      gads.src = (useSSL ? 'https:' : 'http:') + '//www.googletagservices.com/tag/js/gpt.js';
      var node = document.getElementsByTagName('script')[0];
      node.parentNode.insertBefore(gads, node);
   })();
</script>

<script type="text/javascript">
   googletag.cmd.push(function() {

      var pathname = location.href;
      
      if ( (pathname.indexOf("auth") >= 0) || (pathname.indexOf("security") >= 0) ) {
         gptadslots[1]= googletag.defineSlot('/40039723/docs.mongodb.org/security', [[160,600],[243,202],[293,244]],'mongodb-docs-1').addService(googletag.pubads());
      } else if ( (pathname.indexOf("crud") >= 0) ||  (pathname.indexOf("query") >= 0) || (pathname.indexOf("insert") >= 0) || (pathname.indexOf("update") >= 0) || (pathname.indexOf("remove") >= 0) || (pathname.indexOf("delete") >= 0) || (pathname.indexOf("aggregation") >= 0) ) {
         gptadslots[1]= googletag.defineSlot('/40039723/docs.mongodb.org/crud', [[160,600],[243,202],[293,244]],'mongodb-docs-1').addService(googletag.pubads());
      } else if (pathname.indexOf("shard") >= 0) {
         gptadslots[1]= googletag.defineSlot('/40039723/docs.mongodb.org/sharding', [[160,600],[243,202],[293,244]],'mongodb-docs-1').addService(googletag.pubads());
      } else if (pathname.indexOf("replica") >= 0) {
         gptadslots[1]= googletag.defineSlot('/40039723/docs.mongodb.org/replication', [[160,600],[243,202],[293,244]],'mongodb-docs-1').addService(googletag.pubads());
      } else if (pathname.indexOf("model") >= 0) {
         gptadslots[1]= googletag.defineSlot('/40039723/docs.mongodb.org/data-modeling', [[160,600],[243,202],[293,244]],'mongodb-docs-1').addService(googletag.pubads());
      } else if (pathname.indexOf("administration") >= 0) {
         gptadslots[1]= googletag.defineSlot('/40039723/docs.mongodb.org/support', [[160,600],[243,202],[293,244]],'mongodb-docs-1').addService(googletag.pubads());
      } else if (pathname.indexOf("install-mongodb-on-windows") >= 0) {
         gptadslots[1]= googletag.defineSlot('/40039723/docs.mongodb.org/install-mongodb-on-windows', [160, 600], 'mongodb-docs-1').addService(googletag.pubads());
      } else if (pathname.indexOf("tutorial/getting-started") >= 0) {
         gptadslots[1]= googletag.defineSlot('/40039723/docs.mongodb.org/docs_server_gettingstarted', [160, 600], 'mongodb-docs-1').addService(googletag.pubads());
      } else {
         //Adslot 1 declaration
         gptadslots[1]= googletag.defineSlot('/40039723/docs.mongodb.org', [[160,600],[243,202],[293,244]],'mongodb-docs-1').addService(googletag.pubads());
      }
      googletag.pubads().enableSingleRequest();
      googletag.pubads().enableAsyncRendering();
      googletag.enableServices();
   });
</script></head>
<body data-project="manual" data-project-title="MongoDB Manual" data-branch="v4.2" data-enable-marian=1>
  <!-- Google Tag Manager -->
  <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-JQHP"
                    height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
  <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push(
     {'gtm.start': new Date().getTime(),event:'gtm.js'}
   );var f=d.getElementsByTagName(s)[0],
   j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
   '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
   })(window,document,'script','dataLayer','GTM-JQHP');</script>
  <!-- End Google Tag Manager -->
<div id="navbar" data-navprops='{"links": [{"url": "https://docs.mongodb.com/manual/","text": "Server","active": true},{"url": "https://docs.mongodb.com/ecosystem/drivers/","text": "Drivers"},{"url": "https://docs.mongodb.com/cloud/","text": "Cloud"},{"url": "https://docs.mongodb.com/tools/","text": "Tools"},{"url": "https://docs.mongodb.com/guides/","text": "Guides"}]}'></div>
      <script>
        window.googleSearchCx = "017213726194841070573:WMX6838984"
	window.googleSearchPlaceholder = "Search Documentation"
        window.googleSearchResultsUrl = "http://docs.mongodb.com/manual/search/"
      </script>
    <script src="../_static/navbar.min.js"></script>
  

  <div class="content" >

   <div id="left-column">
         <aside id="sidebar" class="sidebar">
             
  <div class="sphinxsidebar" id="sphinxsidebar">
    <div id="sphinxsidebarwrapper" class="sphinxsidebarwrapper"><a href="javascript:void(0)" class="closeNav" id="closeNav">Close &times;</a>


<h3>
  <a class="index-link" href="../index.html">MongoDB Manual</a>
</h3>


    <div class="btn-group version-sidebar">
      <button type="button" class="version-button dropdown-toggle" data-toggle="dropdown">
        
        
        Version 4.2 (current)<span class="caret"></span>
      </button>
      <ul class="dropdown-menu" role="menu">
        
          
          <li>
          
            <a class="version-selector" href="#" data-path="master">
              
              Version 4.4 (upcoming)
            </a>
          </li>
        
          
          <li class="active">
          
            <a href="#" data-path="manual">
              
              Version 4.2 (current)
            </a>
          </li>
        
          
          <li>
          
            <a class="version-selector" href="#" data-path="v4.0">
              
              Version 4.0
            </a>
          </li>
        
          
          <li>
          
            <a class="version-selector" href="#" data-path="v3.6">
              
              Version 3.6
            </a>
          </li>
        
          
          <li>
          
            <a class="version-selector" href="#" data-path="v3.4">
              
              Version 3.4
            </a>
          </li>
        
          
          <li>
          
            <a class="version-selector" href="#" data-path="v3.2">
              
              Version 3.2
            </a>
          </li>
        
          
          <li>
          
            <a class="version-selector" href="#" data-path="v3.0">
              
              Version 3.0
            </a>
          </li>
        
          
          <li>
          
            <a class="version-selector" href="#" data-path="v2.6">
              
              Version 2.6
            </a>
          </li>
        
          
          <li>
          
            <a class="version-selector" href="#" data-path="v2.4">
              
              Version 2.4
            </a>
          </li>
        
          
          <li>
          
            <a class="version-selector" href="#" data-path="v2.2">
              
              Version 2.2
            </a>
          </li>
        
      </ul>
    </div>


<ul class="current"><li class="toctree-l1"><a class="reference internal" href="../introduction.html">Introduction</a><ul><li class="toctree-l2"><a class="reference internal" href="../tutorial/getting-started.html">Getting Started</a></li><li class="toctree-l2"><a class="reference external" href="https://docs.atlas.mongodb.com/getting-started/">Create an Atlas Free Tier Cluster</a></li><li class="toctree-l2"><a class="reference internal" href="databases-and-collections.html">Databases and Collections</a><ul><li class="toctree-l3"><a class="reference internal" href="views.html">Views</a></li><li class="toctree-l3"><a class="reference internal" href="materialized-views.html">On-Demand Materialized Views</a></li><li class="toctree-l3"><a class="reference internal" href="capped-collections.html">Capped Collections</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="document.html">Documents</a></li><li class="toctree-l2"><a class="reference internal" href="../reference/bson-types.html">BSON Types</a><ul><li class="toctree-l3"><a class="reference internal" href="../reference/bson-type-comparison-order.html">Comparison/Sort Order</a></li><li class="toctree-l3"><a class="reference internal" href="../reference/mongodb-extended-json.html">MongoDB Extended JSON (v2)</a></li><li class="toctree-l3"><a class="reference internal" href="../reference/mongodb-extended-json-v1.html">MongoDB Extended JSON (v1)</a></li></ul></li></ul></li><li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a><ul><li class="toctree-l2"><a class="reference internal" href="../administration/install-community.html">Install MongoDB Community Edition</a><ul><li class="toctree-l3"><a class="reference internal" href="../administration/install-on-linux.html">Install on Linux</a><ul><li class="toctree-l4"><a class="reference internal" href="../tutorial/install-mongodb-on-red-hat.html">Install on Red Hat</a><ul><li class="toctree-l5"><a class="reference internal" href="../tutorial/install-mongodb-on-red-hat-tarball.html">Install using .tgz Tarball</a></li></ul></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/install-mongodb-on-ubuntu.html">Install on Ubuntu</a><ul><li class="toctree-l5"><a class="reference internal" href="../tutorial/install-mongodb-on-ubuntu-tarball.html">Install using .tgz Tarball</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/installation-ubuntu-community-troubleshooting.html">Troubleshoot Ubuntu Installation</a></li></ul></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/install-mongodb-on-debian.html">Install on Debian</a><ul><li class="toctree-l5"><a class="reference internal" href="../tutorial/install-mongodb-on-debian-tarball.html">Install using .tgz Tarball</a></li></ul></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/install-mongodb-on-suse.html">Install on SUSE</a><ul><li class="toctree-l5"><a class="reference internal" href="../tutorial/install-mongodb-on-suse-tarball.html">Install using .tgz Tarball</a></li></ul></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/install-mongodb-on-amazon.html">Install on Amazon</a><ul><li class="toctree-l5"><a class="reference internal" href="../tutorial/install-mongodb-on-amazon-tarball.html">Install using .tgz Tarball</a></li></ul></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/install-mongodb-on-os-x.html">Install on macOS</a><ul><li class="toctree-l4"><a class="reference internal" href="../tutorial/install-mongodb-on-os-x-tarball.html">Install using .tgz Tarball</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/install-mongodb-on-windows.html">Install on Windows</a><ul><li class="toctree-l4"><a class="reference internal" href="../tutorial/install-mongodb-on-windows-unattended.html">Install using msiexec.exe</a></li></ul></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../administration/install-enterprise.html">Install MongoDB Enterprise</a><ul><li class="toctree-l3"><a class="reference internal" href="../administration/install-enterprise-linux.html">Install on Linux</a><ul><li class="toctree-l4"><a class="reference internal" href="../tutorial/install-mongodb-enterprise-on-red-hat.html">Install on Red Hat</a><ul><li class="toctree-l5"><a class="reference internal" href="../tutorial/install-mongodb-enterprise-on-red-hat-tarball.html">Install using .tgz Tarball</a></li></ul></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/install-mongodb-enterprise-on-ubuntu.html">Install on Ubuntu</a><ul><li class="toctree-l5"><a class="reference internal" href="../tutorial/install-mongodb-enterprise-on-ubuntu-tarball.html">Install using .tgz Tarball</a></li></ul></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/install-mongodb-enterprise-on-debian.html">Install on Debian</a><ul><li class="toctree-l5"><a class="reference internal" href="../tutorial/install-mongodb-enterprise-on-debian-tarball.html">Install using .tgz Tarball</a></li></ul></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/install-mongodb-enterprise-on-suse.html">Install on SUSE</a><ul><li class="toctree-l5"><a class="reference internal" href="../tutorial/install-mongodb-enterprise-on-suse-tarball.html">Install using .tgz Tarball</a></li></ul></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/install-mongodb-enterprise-on-amazon.html">Install on Amazon</a><ul><li class="toctree-l5"><a class="reference internal" href="../tutorial/install-mongodb-enterprise-on-amazon-tarball.html">Install using .tgz Tarball</a></li></ul></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/install-mongodb-enterprise-on-os-x.html">Install on macOS</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/install-mongodb-enterprise-on-windows.html">Install on Windows</a><ul><li class="toctree-l4"><a class="reference internal" href="../tutorial/install-mongodb-enterprise-on-windows-unattended.html">Install using msiexec.exe</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/install-mongodb-enterprise-with-docker.html">Install with Docker</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../administration/upgrade-community-to-enterprise.html">Upgrade MongoDB Community to MongoDB Enterprise</a><ul><li class="toctree-l3"><a class="reference internal" href="../tutorial/upgrade-to-enterprise-standalone.html">Upgrade to MongoDB Enterprise (Standalone)</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/upgrade-to-enterprise-replica-set.html">Upgrade to MongoDB Enterprise (Replica Set)</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/upgrade-to-enterprise-sharded-cluster.html">Upgrade to MongoDB Enterprise (Sharded Cluster)</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../tutorial/verify-mongodb-packages.html">Verify Integrity of MongoDB Packages</a></li></ul></li><li class="toctree-l1"><a class="reference internal" href="../mongo.html">The <code class="docutils literal"><span class="pre">mongo</span></code> Shell</a><ul><li class="toctree-l2"><a class="reference internal" href="../tutorial/configure-mongo-shell.html">Configure the <code class="docutils literal"><span class="pre">mongo</span></code> Shell</a></li><li class="toctree-l2"><a class="reference internal" href="../tutorial/access-mongo-shell-help.html">Access the <code class="docutils literal"><span class="pre">mongo</span></code> Shell Help</a></li><li class="toctree-l2"><a class="reference internal" href="../tutorial/write-scripts-for-the-mongo-shell.html">Write Scripts for the <code class="docutils literal"><span class="pre">mongo</span></code> Shell</a></li><li class="toctree-l2"><a class="reference internal" href="shell-types.html">Data Types in the <code class="docutils literal"><span class="pre">mongo</span></code> Shell</a></li><li class="toctree-l2"><a class="reference internal" href="../reference/mongo-shell.html"><code class="docutils literal"><span class="pre">mongo</span></code> Shell Quick Reference</a></li></ul></li><li class="toctree-l1"><a class="reference internal" href="../crud.html">MongoDB CRUD Operations</a><ul><li class="toctree-l2"><a class="reference internal" href="../tutorial/insert-documents.html">Insert Documents</a><ul><li class="toctree-l3"><a class="reference internal" href="../reference/insert-methods.html">Insert Methods</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../tutorial/query-documents.html">Query Documents</a><ul><li class="toctree-l3"><a class="reference internal" href="../tutorial/query-embedded-documents.html">Query on Embedded/Nested Documents</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/query-arrays.html">Query an Array</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/query-array-of-documents.html">Query an Array of Embedded Documents</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/project-fields-from-query-results.html">Project Fields to Return from Query</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/query-for-null-fields.html">Query for Null or Missing Fields</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/iterate-a-cursor.html">Iterate a Cursor in the <code class="docutils literal"><span class="pre">mongo</span></code> Shell</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../tutorial/update-documents.html">Update Documents</a><ul><li class="toctree-l3"><a class="reference internal" href="../tutorial/update-documents-with-aggregation-pipeline.html">Updates with Aggregation Pipeline</a></li><li class="toctree-l3"><a class="reference internal" href="../reference/update-methods.html">Update Methods</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../tutorial/remove-documents.html">Delete Documents</a><ul><li class="toctree-l3"><a class="reference internal" href="../reference/delete-methods.html">Delete Methods</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="bulk-write-operations.html">Bulk Write Operations</a></li><li class="toctree-l2"><a class="reference internal" href="retryable-writes.html">Retryable Writes</a></li><li class="toctree-l2"><a class="reference internal" href="../reference/sql-comparison.html">SQL to MongoDB Mapping Chart</a></li><li class="toctree-l2"><a class="reference internal" href="../text-search.html">Text Search</a><ul><li class="toctree-l3"><a class="reference internal" href="link-text-indexes.html">Text Indexes</a></li><li class="toctree-l3"><a class="reference internal" href="text-search-operators.html">Text Search Operators</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/text-search-in-aggregation.html">Text Search in the Aggregation Pipeline</a></li><li class="toctree-l3"><a class="reference internal" href="../reference/text-search-languages.html">Text Search Languages</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../geospatial-queries.html">Geospatial Queries</a><ul><li class="toctree-l3"><a class="reference internal" href="../tutorial/geospatial-tutorial.html">Find Restaurants with Geospatial Queries</a></li><li class="toctree-l3"><a class="reference internal" href="../reference/geojson.html">GeoJSON Objects</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../reference/read-concern.html">Read Isolation (Read Concern)</a><ul><li class="toctree-l3"><a class="reference internal" href="../reference/read-concern-local.html">Read Concern <code class="docutils literal"><span class="pre">&quot;local&quot;</span></code></a></li><li class="toctree-l3"><a class="reference internal" href="../reference/read-concern-available.html">Read Concern <code class="docutils literal"><span class="pre">&quot;available&quot;</span></code></a></li><li class="toctree-l3"><a class="reference internal" href="../reference/read-concern-majority.html">Read Concern <code class="docutils literal"><span class="pre">&quot;majority&quot;</span></code></a></li><li class="toctree-l3"><a class="reference internal" href="../reference/read-concern-linearizable.html">Read Concern <code class="docutils literal"><span class="pre">&quot;linearizable&quot;</span></code></a></li><li class="toctree-l3"><a class="reference internal" href="../reference/read-concern-snapshot.html">Read Concern <code class="docutils literal"><span class="pre">&quot;snapshot&quot;</span></code></a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../reference/write-concern.html">Write Acknowledgement (Write Concern)</a></li><li class="toctree-l2"><a class="reference internal" href="crud.html">MongoDB CRUD Concepts</a><ul><li class="toctree-l3"><a class="reference internal" href="write-operations-atomicity.html">Atomicity and Transactions</a></li><li class="toctree-l3"><a class="reference internal" href="read-isolation-consistency-recency.html">Read Isolation, Consistency, and Recency</a><ul><li class="toctree-l4"><a class="reference internal" href="causal-consistency-read-write-concerns.html">Causal Consistency and Read and Write Concerns</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="distributed-queries.html">Distributed Queries</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/perform-findAndModify-linearizable-reads.html">Linearizable Reads via <code class="docutils literal"><span class="pre">findAndModify</span></code></a></li><li class="toctree-l3"><a class="reference internal" href="query-plans.html">Query Plans</a></li><li class="toctree-l3"><a class="reference internal" href="query-optimization.html">Query Optimization</a><ul><li class="toctree-l4"><a class="reference internal" href="../tutorial/evaluate-operation-performance.html">Evaluate Performance of Current Operations</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/optimize-query-performance-with-indexes-and-projections.html">Optimize Query Performance</a></li><li class="toctree-l4"><a class="reference internal" href="write-performance.html">Write Operation Performance</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/explain-results.html">Explain Results</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/analyze-query-plan.html">Analyze Query Performance</a></li><li class="toctree-l3"><a class="reference internal" href="tailable-cursors.html">Tailable Cursors</a></li></ul></li></ul></li><li class="toctree-l1"><a class="reference internal" href="../aggregation.html">Aggregation</a><ul><li class="toctree-l2"><a class="reference internal" href="aggregation-pipeline.html">Aggregation Pipeline</a><ul><li class="toctree-l3"><a class="reference internal" href="aggregation-pipeline-optimization.html">Aggregation Pipeline Optimization</a></li><li class="toctree-l3"><a class="reference internal" href="aggregation-pipeline-limits.html">Aggregation Pipeline Limits</a></li><li class="toctree-l3"><a class="reference internal" href="aggregation-pipeline-sharded-collections.html">Aggregation Pipeline and Sharded Collections</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/aggregation-zip-code-data-set.html">Example with ZIP Code Data</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/aggregation-with-user-preference-data.html">Example with User Preference Data</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="map-reduce.html">Map-Reduce</a><ul><li class="toctree-l3"><a class="reference internal" href="map-reduce-sharded-collections.html">Map-Reduce and Sharded Collections</a></li><li class="toctree-l3"><a class="reference internal" href="map-reduce-concurrency.html">Map-Reduce Concurrency</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/map-reduce-examples.html">Map-Reduce Examples</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/perform-incremental-map-reduce.html">Perform Incremental Map-Reduce</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/troubleshoot-map-function.html">Troubleshoot the Map Function</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/troubleshoot-reduce-function.html">Troubleshoot the Reduce Function</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../reference/aggregation.html">Aggregation Reference</a><ul><li class="toctree-l3"><a class="reference internal" href="../meta/aggregation-quick-reference.html">Aggregation Pipeline Quick Reference</a></li><li class="toctree-l3"><a class="reference internal" href="../reference/operator/aggregation/interface.html">Aggregation Commands</a></li><li class="toctree-l3"><a class="reference internal" href="../reference/aggregation-commands-comparison.html">Aggregation Commands Comparison</a></li><li class="toctree-l3"><a class="reference internal" href="../reference/aggregation-variables.html">Variables in Aggregation Expressions</a></li><li class="toctree-l3"><a class="reference internal" href="../reference/sql-aggregation-comparison.html">SQL to Aggregation Mapping Chart</a></li></ul></li></ul></li><li class="toctree-l1"><a class="reference internal" href="../data-modeling.html">Data Models</a><ul><li class="toctree-l2"><a class="reference internal" href="data-modeling-introduction.html">Data Modeling Introduction</a></li><li class="toctree-l2"><a class="reference internal" href="schema-validation.html">Schema Validation</a></li><li class="toctree-l2"><a class="reference internal" href="data-models.html">Data Modeling Concepts</a><ul><li class="toctree-l3"><a class="reference internal" href="data-model-design.html">Data Model Design</a></li><li class="toctree-l3"><a class="reference internal" href="data-model-operations.html">Operational Factors and Data Models</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../applications/data-models.html">Data Model Examples and Patterns</a><ul><li class="toctree-l3"><a class="reference internal" href="../applications/data-models-relationships.html">Model Relationships Between Documents</a><ul><li class="toctree-l4"><a class="reference internal" href="../tutorial/model-embedded-one-to-one-relationships-between-documents.html">Model One-to-One Relationships with Embedded Documents</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/model-embedded-one-to-many-relationships-between-documents.html">Model One-to-Many Relationships with Embedded Documents</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/model-referenced-one-to-many-relationships-between-documents.html">Model One-to-Many Relationships with Document References</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../applications/data-models-tree-structures.html">Model Tree Structures</a><ul><li class="toctree-l4"><a class="reference internal" href="../tutorial/model-tree-structures-with-parent-references.html">Model Tree Structures with Parent References</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/model-tree-structures-with-child-references.html">Model Tree Structures with Child References</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/model-tree-structures-with-ancestors-array.html">Model Tree Structures with an Array of Ancestors</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/model-tree-structures-with-materialized-paths.html">Model Tree Structures with Materialized Paths</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/model-tree-structures-with-nested-sets.html">Model Tree Structures with Nested Sets</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../applications/data-models-applications.html">Model Specific Application Contexts</a><ul><li class="toctree-l4"><a class="reference internal" href="../tutorial/model-data-for-atomic-operations.html">Model Data for Atomic Operations</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/model-data-for-keyword-search.html">Model Data to Support Keyword Search</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/model-data-for-schema-versioning.html">Model Data for Schema Versioning</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/model-monetary-data.html">Model Monetary Data</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/model-time-data.html">Model Time Data</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/model-computed-data.html">Model Computed Data</a></li></ul></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../reference/data-models.html">Data Model Reference</a><ul><li class="toctree-l3"><a class="reference internal" href="../reference/database-references.html">Database References</a></li></ul></li></ul></li><li class="toctree-l1 current"><a class="reference internal current" href="">Transactions</a><ul><li class="toctree-l2"><a class="reference internal" href="transactions-in-applications.html">Drivers API</a></li><li class="toctree-l2"><a class="reference internal" href="transactions-production-consideration.html">Production Considerations</a></li><li class="toctree-l2"><a class="reference internal" href="transactions-sharded-clusters.html">Production Considerations (Sharded Clusters)</a></li><li class="toctree-l2"><a class="reference internal" href="transactions-operations.html">Transactions and Operations</a></li></ul></li><li class="toctree-l1"><a class="reference internal" href="../indexes.html">Indexes</a><ul><li class="toctree-l2"><a class="reference internal" href="index-single.html">Single Field Indexes</a></li><li class="toctree-l2"><a class="reference internal" href="index-compound.html">Compound Indexes</a></li><li class="toctree-l2"><a class="reference internal" href="index-multikey.html">Multikey Indexes</a><ul><li class="toctree-l3"><a class="reference internal" href="multikey-index-bounds.html">Multikey Index Bounds</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="index-text.html">Text Indexes</a><ul><li class="toctree-l3"><a class="reference internal" href="../tutorial/specify-language-for-text-index.html">Specify a Language for Text Index</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/avoid-text-index-name-limit.html">Specify Name for <code class="docutils literal"><span class="pre">text</span></code> Index</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/control-results-of-text-search.html">Control Search Results with Weights</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/limit-number-of-items-scanned-for-text-search.html">Limit the Number of Entries Scanned</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="index-wildcard.html">Wildcard Indexes</a><ul><li class="toctree-l3"><a class="reference internal" href="../reference/index-wildcard-restrictions.html">Wildcard Index Restrictions</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="2dsphere.html"><code class="docutils literal"><span class="pre">2dsphere</span></code> Indexes</a><ul><li class="toctree-l3"><a class="reference internal" href="../tutorial/query-a-2dsphere-index.html">Query a <code class="docutils literal"><span class="pre">2dsphere</span></code> Index</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="2d.html"><code class="docutils literal"><span class="pre">2d</span></code> Indexes</a><ul><li class="toctree-l3"><a class="reference internal" href="../tutorial/build-a-2d-index.html">Create a <code class="docutils literal"><span class="pre">2d</span></code> Index</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/query-a-2d-index.html">Query a <code class="docutils literal"><span class="pre">2d</span></code> Index</a></li><li class="toctree-l3"><a class="reference internal" href="geospatial-indexes.html"><code class="docutils literal"><span class="pre">2d</span></code> Index Internals</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/calculate-distances-using-spherical-geometry-with-2d-geospatial-indexes.html">Calculate Distance Using Spherical Geometry</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="geohaystack.html"><code class="docutils literal"><span class="pre">geoHaystack</span></code> Indexes</a><ul><li class="toctree-l3"><a class="reference internal" href="../tutorial/build-a-geohaystack-index.html">Create a Haystack Index</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/query-a-geohaystack-index.html">Query a Haystack Index</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="index-hashed.html">Hashed Indexes</a></li><li class="toctree-l2"><a class="reference internal" href="index-properties.html">Index Properties</a><ul><li class="toctree-l3"><a class="reference internal" href="index-ttl.html">TTL Indexes</a><ul><li class="toctree-l4"><a class="reference internal" href="../tutorial/expire-data.html">Expire Data from Collections by Setting TTL</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="index-unique.html">Unique Indexes</a></li><li class="toctree-l3"><a class="reference internal" href="index-partial.html">Partial Indexes</a></li><li class="toctree-l3"><a class="reference internal" href="index-case-insensitive.html">Case Insensitive Indexes</a></li><li class="toctree-l3"><a class="reference internal" href="index-sparse.html">Sparse Indexes</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="index-creation.html">Index Builds on Populated Collections</a><ul><li class="toctree-l3"><a class="reference internal" href="../tutorial/build-indexes-on-replica-sets.html">Build Indexes on Replica Sets</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/build-indexes-on-sharded-clusters.html">Build Indexes on Sharded Clusters</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="index-intersection.html">Index Intersection</a></li><li class="toctree-l2"><a class="reference internal" href="../tutorial/manage-indexes.html">Manage Indexes</a></li><li class="toctree-l2"><a class="reference internal" href="../tutorial/measure-index-use.html">Measure Index Use</a></li><li class="toctree-l2"><a class="reference internal" href="../applications/indexes.html">Indexing Strategies</a><ul><li class="toctree-l3"><a class="reference internal" href="../tutorial/create-indexes-to-support-queries.html">Create Indexes to Support Your Queries</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/sort-results-with-indexes.html">Use Indexes to Sort Query Results</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/ensure-indexes-fit-ram.html">Ensure Indexes Fit in RAM</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/create-queries-that-ensure-selectivity.html">Create Queries that Ensure Selectivity</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../reference/indexes.html">Indexing Reference</a></li></ul></li><li class="toctree-l1"><a class="reference internal" href="../security.html">Security</a><ul><li class="toctree-l2"><a class="reference internal" href="../administration/security-checklist.html">Security Checklist</a></li><li class="toctree-l2"><a class="reference internal" href="../tutorial/enable-authentication.html">Enable Access Control</a></li><li class="toctree-l2"><a class="reference internal" href="authentication.html">Authentication</a><ul><li class="toctree-l3"><a class="reference internal" href="security-users.html">Users</a><ul><li class="toctree-l4"><a class="reference internal" href="../tutorial/create-users.html">Add Users</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="authentication-mechanisms.html">Authentication Mechanisms</a><ul><li class="toctree-l4"><a class="reference internal" href="security-scram.html">SCRAM</a></li><li class="toctree-l4"><a class="reference internal" href="security-x.509.html">x.509</a><ul><li class="toctree-l5"><a class="reference internal" href="../tutorial/configure-x509-client-authentication.html">Use x.509 Certificates to Authenticate Clients</a></li></ul></li></ul></li><li class="toctree-l3"><a class="reference internal" href="authentication-mechanisms-enterprise.html">Enterprise Authentication Mechanisms</a><ul><li class="toctree-l4"><a class="reference internal" href="kerberos.html">Kerberos Authentication</a><ul><li class="toctree-l5"><a class="reference internal" href="../tutorial/control-access-to-mongodb-with-kerberos-authentication.html">Configure MongoDB with Kerberos Authentication on Linux</a></li><li class="toctree-l5"><a class="reference internal" href="../tutorial/control-access-to-mongodb-windows-with-kerberos-authentication.html">Configure MongoDB with Kerberos Authentication on Windows</a></li><li class="toctree-l5"><a class="reference internal" href="../tutorial/troubleshoot-kerberos.html">Troubleshoot Kerberos Authentication</a></li><li class="toctree-l5"><a class="reference internal" href="../tutorial/kerberos-auth-activedirectory-authz.html">Configure MongoDB with Kerberos Authentication and Active Directory Authorization</a></li></ul></li><li class="toctree-l4"><a class="reference internal" href="security-ldap.html">LDAP Proxy Authentication</a><ul><li class="toctree-l5"><a class="reference internal" href="../tutorial/configure-ldap-sasl-activedirectory.html">Authenticate Using SASL and LDAP with ActiveDirectory</a></li><li class="toctree-l5"><a class="reference internal" href="../tutorial/configure-ldap-sasl-openldap.html">Authenticate Using SASL and LDAP with OpenLDAP</a></li><li class="toctree-l5"><a class="reference internal" href="../tutorial/authenticate-nativeldap-activedirectory.html">Authenticate and Authorize Users Using Active Directory via Native LDAP</a></li></ul></li><li class="toctree-l4"><a class="reference internal" href="security-ldap-external.html">LDAP Authorization</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="security-internal-authentication.html">Internal/Membership Authentication</a><ul><li class="toctree-l4"><a class="reference internal" href="../tutorial/deploy-replica-set-with-keyfile-access-control.html">Deploy Replica Set With Keyfile Authentication</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/enforce-keyfile-access-control-in-existing-replica-set.html">Update Replica Set to Keyfile Authentication</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/enforce-keyfile-access-control-in-existing-replica-set-without-downtime.html">Update Replica Set to Keyfile Authentication (No Downtime)</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/rotate-key-replica-set.html">Rotate Keys for Replica Sets</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/deploy-sharded-cluster-with-keyfile-access-control.html">Deploy Sharded Cluster with Keyfile Authentication</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/enforce-keyfile-access-control-in-existing-sharded-cluster.html">Update Sharded Cluster to Keyfile Authentication</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/enforce-keyfile-access-control-in-existing-sharded-cluster-no-downtime.html">Update Sharded Cluster to Keyfile Authentication (No Downtime)</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/rotate-key-sharded-cluster.html">Rotate Keys for Sharded Clusters</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/configure-x509-member-authentication.html">Use x.509 Certificate for Membership Authentication</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/upgrade-keyfile-to-x509.html">Upgrade from Keyfile Authentication to x.509 Authentication</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/rotate-x509-membership-certificates.html">Rolling Update of x.509 Cluster Certificates that Contain New DN</a></li></ul></li></ul></li><li class="toctree-l2"><a class="reference internal" href="authorization.html">Role-Based Access Control</a><ul><li class="toctree-l3"><a class="reference internal" href="../reference/built-in-roles.html">Built-In Roles</a></li><li class="toctree-l3"><a class="reference internal" href="security-user-defined-roles.html">User-Defined Roles</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/manage-users-and-roles.html">Manage Users and Roles</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/change-own-password-and-custom-data.html">Change Your Password and Custom Data</a></li><li class="toctree-l3"><a class="reference internal" href="collection-level-access-control.html">Collection-Level Access Control</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="security-transport-encryption.html">TLS/SSL (Transport Encryption)</a><ul><li class="toctree-l3"><a class="reference internal" href="../tutorial/configure-ssl.html">Configure <code class="docutils literal"><span class="pre">mongod</span></code> and <code class="docutils literal"><span class="pre">mongos</span></code> for TLS/SSL</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/configure-ssl-clients.html">TLS/SSL Configuration for Clients</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/upgrade-cluster-to-ssl.html">Upgrade a Cluster to Use TLS/SSL</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/configure-fips.html">Configure MongoDB for FIPS</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="security-encryption-at-rest.html">Encryption at Rest</a><ul><li class="toctree-l3"><a class="reference internal" href="../tutorial/configure-encryption.html">Configure Encryption</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/rotate-encryption-key.html">Rotate Encryption Keys</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="security-client-side-encryption.html">Client-Side Field Level Encryption</a><ul><li class="toctree-l3"><a class="reference internal" href="security-automatic-client-side-encryption.html">Automatic Client-Side Field Level Encryption</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/security-client-side-automatic-json-schema.html">Automatic Encryption Rules</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/security-client-side-query-aggregation-support.html">Read/Write Support with Automatic Field Level Encryption</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/security-client-side-encryption-appendix.html">Appendix</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="security-explicit-client-side-encryption.html">Explicit (Manual) Client-Side Field Level Encryption</a></li><li class="toctree-l3"><a class="reference internal" href="security-client-side-encryption-key-management.html">Master Key and Data Encryption Key Management</a><ul><li class="toctree-l4"><a class="reference internal" href="../tutorial/manage-client-side-encryption-data-keys.html">Manage Data Encryption Keys</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/security-client-side-encryption-limitations.html">Limitations</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="auditing.html">Auditing</a><ul><li class="toctree-l3"><a class="reference internal" href="../tutorial/configure-auditing.html">Configure Auditing</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/configure-audit-filters.html">Configure Audit Filters</a></li><li class="toctree-l3"><a class="reference internal" href="../reference/audit-message.html">System Event Audit Messages</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="security-hardening.html">Network and Configuration Hardening</a><ul><li class="toctree-l3"><a class="reference internal" href="security-mongodb-configuration.html">IP Binding</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/configure-linux-iptables-firewall.html">Configure Linux <code class="docutils literal"><span class="pre">iptables</span></code> Firewall for MongoDB</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/configure-windows-netsh-firewall.html">Configure Windows <code class="docutils literal"><span class="pre">netsh</span></code> Firewall for MongoDB</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../tutorial/implement-field-level-redaction.html">Implement Field Level Redaction</a></li><li class="toctree-l2"><a class="reference internal" href="../reference/security.html">Security Reference</a><ul><li class="toctree-l3"><a class="reference internal" href="../reference/system-roles-collection.html"><code class="docutils literal"><span class="pre">system.roles</span></code> Collection</a></li><li class="toctree-l3"><a class="reference internal" href="../reference/system-users-collection.html"><code class="docutils literal"><span class="pre">system.users</span></code> Collection</a></li><li class="toctree-l3"><a class="reference internal" href="../reference/resource-document.html">Resource Document</a></li><li class="toctree-l3"><a class="reference internal" href="../reference/privilege-actions.html">Privilege Actions</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../tutorial/create-a-vulnerability-report.html">Create a Vulnerability Report</a></li><li class="toctree-l2"><a class="reference internal" href="../appendix/security.html">Appendix</a><ul><li class="toctree-l3"><a class="reference internal" href="../appendix/security/appendixA-openssl-ca.html">Appendix A - OpenSSL CA Certificate for Testing</a></li><li class="toctree-l3"><a class="reference internal" href="../appendix/security/appendixB-openssl-server.html">Appendix B - OpenSSL Server Certificates for Testing</a></li><li class="toctree-l3"><a class="reference internal" href="../appendix/security/appendixC-openssl-client.html">Appendix C - OpenSSL Client Certificates for Testing</a></li></ul></li></ul></li><li class="toctree-l1"><a class="reference internal" href="../changeStreams.html">Change Streams</a><ul><li class="toctree-l2"><a class="reference internal" href="../administration/change-streams-production-recommendations.html">Change Streams Production Recommendations</a></li><li class="toctree-l2"><a class="reference internal" href="../reference/change-events.html">Change Events</a></li></ul></li><li class="toctree-l1"><a class="reference internal" href="../replication.html">Replication</a><ul><li class="toctree-l2"><a class="reference internal" href="replica-set-members.html">Replica Set Members</a><ul><li class="toctree-l3"><a class="reference internal" href="replica-set-primary.html">Replica Set Primary</a></li><li class="toctree-l3"><a class="reference internal" href="replica-set-secondary.html">Replica Set Secondary Members</a><ul><li class="toctree-l4"><a class="reference internal" href="replica-set-priority-0-member.html">Priority 0 Replica Set Members</a></li><li class="toctree-l4"><a class="reference internal" href="replica-set-hidden-member.html">Hidden Replica Set Members</a></li><li class="toctree-l4"><a class="reference internal" href="replica-set-delayed-member.html">Delayed Replica Set Members</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="replica-set-arbiter.html">Replica Set Arbiter</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="replica-set-oplog.html">Replica Set Oplog</a></li><li class="toctree-l2"><a class="reference internal" href="replica-set-sync.html">Replica Set Data Synchronization</a></li><li class="toctree-l2"><a class="reference internal" href="replica-set-architectures.html">Replica Set Deployment Architectures</a><ul><li class="toctree-l3"><a class="reference internal" href="replica-set-architecture-three-members.html">Three Member Replica Sets</a></li><li class="toctree-l3"><a class="reference internal" href="replica-set-architecture-geographically-distributed.html">Replica Sets Distributed Across Two or More Data Centers</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="replica-set-high-availability.html">Replica Set High Availability</a><ul><li class="toctree-l3"><a class="reference internal" href="replica-set-elections.html">Replica Set Elections</a></li><li class="toctree-l3"><a class="reference internal" href="replica-set-rollbacks.html">Rollbacks During Replica Set Failover</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../applications/replication.html">Replica Set Read and Write Semantics</a><ul><li class="toctree-l3"><a class="reference internal" href="replica-set-write-concern.html">Write Concern for Replica Sets</a></li><li class="toctree-l3"><a class="reference internal" href="read-preference.html">Read Preference</a><ul><li class="toctree-l4"><a class="reference internal" href="read-preference-tags.html">Tag Sets</a></li><li class="toctree-l4"><a class="reference internal" href="read-preference-staleness.html">maxStalenessSeconds</a></li><li class="toctree-l4"><a class="reference internal" href="read-preference-use-cases.html">Read Preference Use Cases</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="read-preference-mechanics.html">Server Selection Algorithm</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../administration/replica-set-deployment.html">Replica Set Deployment Tutorials</a><ul><li class="toctree-l3"><a class="reference internal" href="../tutorial/deploy-replica-set.html">Deploy a Replica Set</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/deploy-replica-set-for-testing.html">Deploy a Replica Set for Testing and Development</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/deploy-geographically-distributed-replica-set.html">Deploy a Geographically Redundant Replica Set</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/add-replica-set-arbiter.html">Add an Arbiter to Replica Set</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/convert-standalone-to-replica-set.html">Convert a Standalone to a Replica Set</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/expand-replica-set.html">Add Members to a Replica Set</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/remove-replica-set-member.html">Remove Members from Replica Set</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/replace-replica-set-member.html">Replace a Replica Set Member</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../administration/replica-set-member-configuration.html">Member Configuration Tutorials</a><ul><li class="toctree-l3"><a class="reference internal" href="../tutorial/adjust-replica-set-member-priority.html">Adjust Priority for Replica Set Member</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/configure-secondary-only-replica-set-member.html">Prevent Secondary from Becoming Primary</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/configure-a-hidden-replica-set-member.html">Configure a Hidden Replica Set Member</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/configure-a-delayed-replica-set-member.html">Configure a Delayed Replica Set Member</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/configure-a-non-voting-replica-set-member.html">Configure Non-Voting Replica Set Member</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/convert-secondary-into-arbiter.html">Convert a Secondary to an Arbiter</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../administration/replica-set-maintenance.html">Replica Set Maintenance Tutorials</a><ul><li class="toctree-l3"><a class="reference internal" href="../tutorial/change-oplog-size.html">Change the Size of the Oplog</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/perform-maintence-on-replica-set-members.html">Perform Maintenance on Replica Set Members</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/force-member-to-be-primary.html">Force a Member to Become Primary</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/resync-replica-set-member.html">Resync a Member of a Replica Set</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/configure-replica-set-tag-sets.html">Configure Replica Set Tag Sets</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/reconfigure-replica-set-with-unavailable-members.html">Reconfigure a Replica Set with Unavailable Members</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/manage-chained-replication.html">Manage Chained Replication</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/change-hostnames-in-a-replica-set.html">Change Hostnames in a Replica Set</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/configure-replica-set-secondary-sync-target.html">Configure a Secondary’s Sync Target</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../reference/replication.html">Replication Reference</a><ul><li class="toctree-l3"><a class="reference internal" href="../reference/replica-configuration.html">Replica Set Configuration</a></li><li class="toctree-l3"><a class="reference internal" href="../reference/replica-set-protocol-versions.html">Replica Set Protocol Version</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/troubleshoot-replica-sets.html">Troubleshoot Replica Sets</a></li><li class="toctree-l3"><a class="reference internal" href="../reference/local-database.html">The <code class="docutils literal"><span class="pre">local</span></code> Database</a></li><li class="toctree-l3"><a class="reference internal" href="../reference/replica-states.html">Replica Set Member States</a></li></ul></li></ul></li><li class="toctree-l1"><a class="reference internal" href="../sharding.html">Sharding</a><ul><li class="toctree-l2"><a class="reference internal" href="sharded-cluster-components.html">Sharded Cluster Components</a><ul><li class="toctree-l3"><a class="reference internal" href="sharded-cluster-shards.html">Shards</a></li><li class="toctree-l3"><a class="reference internal" href="sharded-cluster-config-servers.html">Config Servers (metadata)</a></li><li class="toctree-l3"><a class="reference internal" href="sharded-cluster-query-router.html">Router (mongos)</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="sharding-shard-key.html">Shard Keys</a></li><li class="toctree-l2"><a class="reference internal" href="hashed-sharding.html">Hashed Sharding</a></li><li class="toctree-l2"><a class="reference internal" href="ranged-sharding.html">Ranged Sharding</a></li><li class="toctree-l2"><a class="reference internal" href="../tutorial/deploy-shard-cluster.html">Deploy a Sharded Cluster</a></li><li class="toctree-l2"><a class="reference internal" href="zone-sharding.html">Zones</a><ul><li class="toctree-l3"><a class="reference internal" href="../tutorial/manage-shard-zone.html">Manage Shard Zones</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/sharding-segmenting-data-by-location.html">Segmenting Data by Location</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/sharding-tiered-hardware-for-varying-slas.html">Tiered Hardware for Varying SLA or SLO</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/sharding-segmenting-shards.html">Segmenting Data by Application or Customer</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/sharding-high-availability-writes.html">Distributed Local Writes for Insert Only Workloads</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="sharding-data-partitioning.html">Data Partitioning with Chunks</a><ul><li class="toctree-l3"><a class="reference internal" href="../tutorial/create-chunks-in-sharded-cluster.html">Create Chunks in a Sharded Cluster</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/split-chunks-in-sharded-cluster.html">Split Chunks in a Sharded Cluster</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/merge-chunks-in-sharded-cluster.html">Merge Chunks in a Sharded Cluster</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/modify-chunk-size-in-sharded-cluster.html">Modify Chunk Size in a Sharded Cluster</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="sharding-balancer-administration.html">Balancer</a><ul><li class="toctree-l3"><a class="reference internal" href="../tutorial/manage-sharded-cluster-balancer.html">Manage Sharded Cluster Balancer</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/migrate-chunks-in-sharded-cluster.html">Migrate Chunks in a Sharded Cluster</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../administration/sharded-cluster-administration.html">Administration</a><ul><li class="toctree-l3"><a class="reference internal" href="../administration/sharded-cluster-config-servers.html">Config Server Administration</a><ul><li class="toctree-l4"><a class="reference internal" href="../tutorial/replace-config-server.html">Replace a Config Server</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/view-sharded-cluster-configuration.html">View Cluster Configuration</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/restart-sharded-cluster.html">Restart a Sharded Cluster</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/migrate-sharded-cluster-to-new-hardware.html">Migrate a Sharded Cluster to Different Hardware</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/add-shards-to-shard-cluster.html">Add Shards to a Cluster</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/remove-shards-from-cluster.html">Remove Shards from an Existing Sharded Cluster</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/clear-jumbo-flag.html">Clear <code class="docutils literal"><span class="pre">jumbo</span></code> Flag</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/backup-sharded-cluster-metadata.html">Back Up Cluster Metadata</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/convert-sharded-cluster-to-replica-set.html">Convert Sharded Cluster to Replica Set</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/convert-replica-set-to-replicated-shard-cluster.html">Convert a Replica Set to a Sharded Cluster</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/convert-shard-standalone-to-shard-replica-set.html">Convert a Shard Standalone to a Shard Replica Set</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../reference/sharding.html">Sharding Reference</a><ul><li class="toctree-l3"><a class="reference internal" href="sharded-cluster-requirements.html">Operational Restrictions</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/troubleshoot-sharded-clusters.html">Troubleshoot Sharded Clusters</a></li><li class="toctree-l3"><a class="reference internal" href="../reference/config-database.html">Config Database</a></li></ul></li></ul></li><li class="toctree-l1"><a class="reference internal" href="../administration.html">Administration</a><ul><li class="toctree-l2"><a class="reference internal" href="../administration/production-notes.html">Production Notes</a></li><li class="toctree-l2"><a class="reference internal" href="../administration/production-checklist-operations.html">Operations Checklist</a></li><li class="toctree-l2"><a class="reference internal" href="../administration/production-checklist-development.html">Development Checklist</a></li><li class="toctree-l2"><a class="reference internal" href="../administration/analyzing-mongodb-performance.html">Performance</a><ul><li class="toctree-l3"><a class="reference internal" href="../tutorial/manage-the-database-profiler.html">Database Profiler</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/database-profiler.html">Database Profiler Output</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/transparent-huge-pages.html">Disable Transparent Huge Pages (THP)</a></li><li class="toctree-l3"><a class="reference internal" href="../reference/ulimit.html">UNIX <code class="docutils literal"><span class="pre">ulimit</span></code> Settings</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../administration/configuration-and-maintenance.html">Configuration and Maintenance</a><ul><li class="toctree-l3"><a class="reference internal" href="../administration/configuration.html">Run-time Database Configuration</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/upgrade-revision.html">Upgrade to the Latest Revision of MongoDB</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/manage-mongodb-processes.html">Manage <code class="docutils literal"><span class="pre">mongod</span></code> Processes</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/terminate-running-operations.html">Terminate Running Operations</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/rotate-log-files.html">Rotate Log Files</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../data-center-awareness.html">Data Center Awareness</a><ul><li class="toctree-l3"><a class="reference internal" href="workload-isolation.html">Workload Isolation in MongoDB Deployments</a></li><li class="toctree-l3"><a class="reference internal" href="zone-sharding.html">Zones</a><ul><li class="toctree-l4"><a class="reference internal" href="../tutorial/manage-shard-zone.html">Manage Shard Zones</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/sharding-segmenting-data-by-location.html">Segmenting Data by Location</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/sharding-tiered-hardware-for-varying-slas.html">Tiered Hardware for Varying SLA or SLO</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/sharding-segmenting-shards.html">Segmenting Data by Application or Customer</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/sharding-high-availability-writes.html">Distributed Local Writes for Insert Only Workloads</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/manage-shard-zone.html">Manage Shard Zones</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="backups.html">MongoDB Backup Methods</a><ul><li class="toctree-l3"><a class="reference internal" href="../tutorial/backup-with-filesystem-snapshots.html">Back Up and Restore with Filesystem Snapshots</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/backup-and-restore-tools.html">Back Up and Restore with MongoDB Tools</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/restore-replica-set-from-backup.html">Restore a Replica Set from MongoDB Backups</a></li><li class="toctree-l3"><a class="reference internal" href="../administration/backup-sharded-clusters.html">Backup and Restore Sharded Clusters</a><ul><li class="toctree-l4"><a class="reference internal" href="../tutorial/backup-sharded-cluster-with-filesystem-snapshots.html">Back Up a Sharded Cluster with File System Snapshots</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/backup-sharded-cluster-with-database-dumps.html">Back Up a Sharded Cluster with Database Dumps</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/schedule-backup-window-for-sharded-clusters.html">Schedule Backup Window for Sharded Clusters</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/restore-sharded-cluster.html">Restore a Sharded Cluster</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/recover-data-following-unexpected-shutdown.html">Recover a Standalone after an Unexpected Shutdown</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../administration/monitoring.html">Monitoring for MongoDB</a><ul><li class="toctree-l3"><a class="reference internal" href="../administration/free-monitoring.html">Free Monitoring</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/monitor-with-snmp.html">Monitor MongoDB With SNMP on Linux</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/monitor-with-snmp-on-windows.html">Monitor MongoDB Windows with SNMP</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/troubleshoot-snmp.html">Troubleshoot SNMP</a></li></ul></li></ul></li><li class="toctree-l1"><a class="reference internal" href="../storage.html">Storage</a><ul><li class="toctree-l2"><a class="reference internal" href="storage-engines.html">Storage Engines</a><ul><li class="toctree-l3"><a class="reference internal" href="wiredtiger.html">WiredTiger Storage Engine</a><ul><li class="toctree-l4"><a class="reference internal" href="../tutorial/change-standalone-wiredtiger.html">Change Standalone to WiredTiger</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/change-replica-set-wiredtiger.html">Change Replica Set to WiredTiger</a></li><li class="toctree-l4"><a class="reference internal" href="../tutorial/change-sharded-cluster-wiredtiger.html">Change Sharded Cluster to WiredTiger</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="inmemory.html">In-Memory Storage Engine</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="journaling.html">Journaling</a><ul><li class="toctree-l3"><a class="reference internal" href="../tutorial/manage-journaling.html">Manage Journaling</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="gridfs.html">GridFS</a></li><li class="toctree-l2"><a class="reference internal" href="../faq/storage.html">FAQ: MongoDB Storage</a></li></ul></li><li class="toctree-l1"><a class="reference internal" href="../faq.html">Frequently Asked Questions</a><ul><li class="toctree-l2"><a class="reference internal" href="../faq/fundamentals.html">FAQ: MongoDB Fundamentals</a></li><li class="toctree-l2"><a class="reference internal" href="../faq/indexes.html">FAQ: Indexes</a></li><li class="toctree-l2"><a class="reference internal" href="../faq/concurrency.html">FAQ: Concurrency</a></li><li class="toctree-l2"><a class="reference internal" href="../faq/sharding.html">FAQ: Sharding with MongoDB</a></li><li class="toctree-l2"><a class="reference internal" href="../faq/replica-sets.html">FAQ: Replication and Replica Sets</a></li><li class="toctree-l2"><a class="reference internal" href="../faq/storage.html">FAQ: MongoDB Storage</a></li><li class="toctree-l2"><a class="reference internal" href="../faq/diagnostics.html">FAQ: MongoDB Diagnostics</a></li></ul></li><li class="toctree-l1"><a class="reference internal" href="../reference.html">Reference</a><ul><li class="toctree-l2"><a class="reference internal" href="../reference/operator.html">Operators</a><ul><li class="toctree-l3"><a class="reference internal" href="../reference/operator/query.html">Query and Projection Operators</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/operator/query-comparison.html">Comparison Query Operators</a><ul><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/eq.html">$eq</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/gt.html">$gt</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/gte.html">$gte</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/in.html">$in</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/lt.html">$lt</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/lte.html">$lte</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/ne.html">$ne</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/nin.html">$nin</a></li></ul></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/query-logical.html">Logical Query Operators</a><ul><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/and.html">$and</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/not.html">$not</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/nor.html">$nor</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/or.html">$or</a></li></ul></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/query-element.html">Element Query Operators</a><ul><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/exists.html">$exists</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/type.html">$type</a></li></ul></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/query-evaluation.html">Evaluation Query Operators</a><ul><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/expr.html">$expr</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/jsonSchema.html">$jsonSchema</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/mod.html">$mod</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/regex.html">$regex</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/text.html">$text</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/where.html">$where</a></li></ul></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/query-geospatial.html">Geospatial Query Operators</a><ul><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/geoIntersects.html">$geoIntersects</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/geoWithin.html">$geoWithin</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/near.html">$near</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/nearSphere.html">$nearSphere</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/box.html">$box</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/center.html">$center</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/centerSphere.html">$centerSphere</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/geometry.html">$geometry</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/maxDistance.html">$maxDistance</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/minDistance.html">$minDistance</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/polygon.html">$polygon</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/uniqueDocs.html">$uniqueDocs</a></li></ul></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/query-array.html">Array Query Operators</a><ul><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/all.html">$all</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/elemMatch.html">$elemMatch (query)</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/size.html">$size</a></li></ul></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/query-bitwise.html">Bitwise Query Operators</a><ul><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/bitsAllClear.html">$bitsAllClear</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/bitsAllSet.html">$bitsAllSet</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/bitsAnyClear.html">$bitsAnyClear</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/query/bitsAnySet.html">$bitsAnySet</a></li></ul></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/query/comment.html">$comment</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/projection.html">Projection Operators</a><ul><li class="toctree-l5"><a class="reference internal" href="../reference/operator/projection/positional.html">$ (projection)</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/projection/elemMatch.html">$elemMatch (projection)</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/projection/meta.html">$meta</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/projection/slice.html">$slice (projection)</a></li></ul></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/operator/update.html">Update Operators</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/operator/update-field.html">Field Update Operators</a><ul><li class="toctree-l5"><a class="reference internal" href="../reference/operator/update/currentDate.html">$currentDate</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/update/inc.html">$inc</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/update/min.html">$min</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/update/max.html">$max</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/update/mul.html">$mul</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/update/rename.html">$rename</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/update/set.html">$set</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/update/setOnInsert.html">$setOnInsert</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/update/unset.html">$unset</a></li></ul></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/update-array.html">Array Update Operators</a><ul><li class="toctree-l5"><a class="reference internal" href="../reference/operator/update/positional.html">$ (update)</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/update/positional-all.html">$[]</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/update/positional-filtered.html">$[&lt;identifier&gt;]</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/update/addToSet.html">$addToSet</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/update/pop.html">$pop</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/update/pull.html">$pull</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/update/push.html">$push</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/update/pullAll.html">$pullAll</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/update/each.html">$each</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/update/position.html">$position</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/update/slice.html">$slice</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/operator/update/sort.html">$sort</a></li></ul></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/update-bitwise.html">Bitwise Update Operator</a><ul><li class="toctree-l5"><a class="reference internal" href="../reference/operator/update/bit.html">$bit</a></li></ul></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/operator/aggregation-pipeline.html">Aggregation Pipeline Stages</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/addFields.html">$addFields (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/bucket.html">$bucket (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/bucketAuto.html">$bucketAuto (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/collStats.html">$collStats (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/count.html">$count (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/currentOp.html">$currentOp (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/facet.html">$facet (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/geoNear.html">$geoNear (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/graphLookup.html">$graphLookup (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/group.html">$group (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/indexStats.html">$indexStats (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/limit.html">$limit (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/listLocalSessions.html">$listLocalSessions</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/listSessions.html">$listSessions</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/lookup.html">$lookup (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/match.html">$match (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/merge.html">$merge (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/out.html">$out (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/planCacheStats.html">$planCacheStats</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/project.html">$project (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/redact.html">$redact (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/replaceRoot.html">$replaceRoot (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/replaceWith.html">$replaceWith (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/sample.html">$sample (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/set.html">$set (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/skip.html">$skip (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/sort.html">$sort (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/sortByCount.html">$sortByCount (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/unset.html">$unset (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/unwind.html">$unwind (aggregation)</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/operator/aggregation.html">Aggregation Pipeline Operators</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/abs.html">$abs (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/acos.html">$acos (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/acosh.html">$acosh (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/add.html">$add (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/addToSet.html">$addToSet (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/allElementsTrue.html">$allElementsTrue (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/and.html">$and (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/anyElementTrue.html">$anyElementTrue (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/arrayElemAt.html">$arrayElemAt (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/arrayToObject.html">$arrayToObject (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/asin.html">$asin (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/asinh.html">$asinh (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/atan.html">$atan (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/atan2.html">$atan2 (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/atanh.html">$atanh (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/avg.html">$avg (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/ceil.html">$ceil (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/cmp.html">$cmp (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/concat.html">$concat (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/concatArrays.html">$concatArrays (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/cond.html">$cond (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/convert.html">$convert (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/cos.html">$cos (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/dateFromParts.html">$dateFromParts (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/dateToParts.html">$dateToParts (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/dateFromString.html">$dateFromString (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/dateToString.html">$dateToString (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/dayOfMonth.html">$dayOfMonth (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/dayOfWeek.html">$dayOfWeek (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/dayOfYear.html">$dayOfYear (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/degreesToRadians.html">$degreesToRadians (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/divide.html">$divide (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/eq.html">$eq (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/exp.html">$exp (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/filter.html">$filter (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/first.html">$first (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/floor.html">$floor (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/gt.html">$gt (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/gte.html">$gte (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/hour.html">$hour (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/ifNull.html">$ifNull (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/in.html">$in (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/indexOfArray.html">$indexOfArray (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/indexOfBytes.html">$indexOfBytes (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/indexOfCP.html">$indexOfCP (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/isArray.html">$isArray (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/isoDayOfWeek.html">$isoDayOfWeek (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/isoWeek.html">$isoWeek (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/isoWeekYear.html">$isoWeekYear (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/last.html">$last (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/let.html">$let (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/literal.html">$literal (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/ln.html">$ln (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/log.html">$log (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/log10.html">$log10 (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/lt.html">$lt (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/lte.html">$lte (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/ltrim.html">$ltrim (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/map.html">$map (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/max.html">$max (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/mergeObjects.html">$mergeObjects (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/meta.html">$meta (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/min.html">$min (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/millisecond.html">$millisecond (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/minute.html">$minute (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/mod.html">$mod (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/month.html">$month (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/multiply.html">$multiply (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/ne.html">$ne (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/not.html">$not (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/objectToArray.html">$objectToArray (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/or.html">$or (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/pow.html">$pow (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/push.html">$push (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/radiansToDegrees.html">$radiansToDegrees (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/range.html">$range (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/reduce.html">$reduce (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/regexFind.html">$regexFind (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/regexFindAll.html">$regexFindAll (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/regexMatch.html">$regexMatch (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/reverseArray.html">$reverseArray (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/round.html">$round (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/rtrim.html">$rtrim (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/second.html">$second (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/setDifference.html">$setDifference (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/setEquals.html">$setEquals (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/setIntersection.html">$setIntersection (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/setIsSubset.html">$setIsSubset (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/setUnion.html">$setUnion (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/size.html">$size (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/sin.html">$sin (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/slice.html">$slice (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/split.html">$split (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/sqrt.html">$sqrt (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/stdDevPop.html">$stdDevPop (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/stdDevSamp.html">$stdDevSamp (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/strcasecmp.html">$strcasecmp (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/strLenBytes.html">$strLenBytes (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/strLenCP.html">$strLenCP (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/substr.html">$substr (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/substrBytes.html">$substrBytes (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/substrCP.html">$substrCP (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/subtract.html">$subtract (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/sum.html">$sum (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/switch.html">$switch (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/tan.html">$tan (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/toBool.html">$toBool (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/toDate.html">$toDate (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/toDecimal.html">$toDecimal (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/toDouble.html">$toDouble(aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/toInt.html">$toInt (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/toLong.html">$toLong (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/toObjectId.html">$toObjectId (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/toString.html">$toString (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/toLower.html">$toLower (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/toUpper.html">$toUpper (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/trim.html">$trim (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/trunc.html">$trunc (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/type.html">$type (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/week.html">$week (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/year.html">$year (aggregation)</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/aggregation/zip.html">$zip (aggregation)</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/operator/query-modifier.html">Query Modifiers</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/operator/meta/comment.html">$comment</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/meta/explain.html">$explain</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/meta/hint.html">$hint</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/meta/max.html">$max</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/meta/maxTimeMS.html">$maxTimeMS</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/meta/min.html">$min</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/meta/orderby.html">$orderby</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/meta/query.html">$query</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/meta/returnKey.html">$returnKey</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/meta/showDiskLoc.html">$showDiskLoc</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/operator/meta/natural.html">$natural</a></li></ul></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../reference/command.html">Database Commands</a><ul><li class="toctree-l3"><a class="reference internal" href="../reference/command/nav-aggregation.html">Aggregation Commands</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/command/aggregate.html">aggregate</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/count.html">count</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/distinct.html">distinct</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/mapReduce.html">mapReduce</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/command/nav-geospatial.html">Geospatial Commands</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/command/geoSearch.html">geoSearch</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/command/nav-crud.html">Query and Write Operation Commands</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/command/delete.html">delete</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/find.html">find</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/findAndModify.html">findAndModify</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/getLastError.html">getLastError</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/getMore.html">getMore</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/insert.html">insert</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/resetError.html">resetError</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/update.html">update</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/command/nav-plan-cache.html">Query Plan Cache Commands</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/command/planCacheClear.html">planCacheClear</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/planCacheClearFilters.html">planCacheClearFilters</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/planCacheListFilters.html">planCacheListFilters</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/planCacheListPlans.html">planCacheListPlans</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/planCacheListQueryShapes.html">planCacheListQueryShapes</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/planCacheSetFilter.html">planCacheSetFilter</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/command/nav-authentication.html">Authentication Commands</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/command/authenticate.html">authenticate</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/getnonce.html">getnonce</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/logout.html">logout</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/command/nav-user-management.html">User Management Commands</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/command/createUser.html">createUser</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/dropAllUsersFromDatabase.html">dropAllUsersFromDatabase</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/dropUser.html">dropUser</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/grantRolesToUser.html">grantRolesToUser</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/revokeRolesFromUser.html">revokeRolesFromUser</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/updateUser.html">updateUser</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/usersInfo.html">usersInfo</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/command/nav-role-management.html">Role Management Commands</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/command/createRole.html">createRole</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/dropRole.html">dropRole</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/dropAllRolesFromDatabase.html">dropAllRolesFromDatabase</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/grantPrivilegesToRole.html">grantPrivilegesToRole</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/grantRolesToRole.html">grantRolesToRole</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/invalidateUserCache.html">invalidateUserCache</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/revokePrivilegesFromRole.html">revokePrivilegesFromRole</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/revokeRolesFromRole.html">revokeRolesFromRole</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/rolesInfo.html">rolesInfo</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/updateRole.html">updateRole</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/command/nav-replication.html">Replication Commands</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/command/applyOps.html">applyOps</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/isMaster.html">isMaster</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/replSetAbortPrimaryCatchUp.html">replSetAbortPrimaryCatchUp</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/replSetFreeze.html">replSetFreeze</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/replSetGetConfig.html">replSetGetConfig</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/replSetGetStatus.html">replSetGetStatus</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/replSetInitiate.html">replSetInitiate</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/replSetMaintenance.html">replSetMaintenance</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/replSetReconfig.html">replSetReconfig</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/replSetResizeOplog.html">replSetResizeOplog</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/replSetStepDown.html">replSetStepDown</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/replSetSyncFrom.html">replSetSyncFrom</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/command/nav-sharding.html">Sharding Commands</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/command/addShard.html">addShard</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/addShardToZone.html">addShardToZone</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/balancerStart.html">balancerStart</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/balancerStatus.html">balancerStatus</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/balancerStop.html">balancerStop</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/checkShardingIndex.html">checkShardingIndex</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/clearJumboFlag.html">clearJumboFlag</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/cleanupOrphaned.html">cleanupOrphaned</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/enableSharding.html">enableSharding</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/flushRouterConfig.html">flushRouterConfig</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/getShardMap.html">getShardMap</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/getShardVersion.html">getShardVersion</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/isdbgrid.html">isdbgrid</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/listShards.html">listShards</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/medianKey.html">medianKey</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/moveChunk.html">moveChunk</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/movePrimary.html">movePrimary</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/mergeChunks.html">mergeChunks</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/removeShard.html">removeShard</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/removeShardFromZone.html">removeShardFromZone</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/setShardVersion.html">setShardVersion</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/shardCollection.html">shardCollection</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/shardingState.html">shardingState</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/split.html">split</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/splitChunk.html">splitChunk</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/splitVector.html">splitVector</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/unsetSharding.html">unsetSharding</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/updateZoneKeyRange.html">updateZoneKeyRange</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/command/nav-sessions.html">Sessions Commands</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/command/abortTransaction.html">abortTransaction</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/commitTransaction.html">commitTransaction</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/endSessions.html">endSessions</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/killAllSessions.html">killAllSessions</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/killAllSessionsByPattern.html">killAllSessionsByPattern</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/killSessions.html">killSessions</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/refreshSessions.html">refreshSessions</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/startSession.html">startSession</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/command/nav-administration.html">Administration Commands</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/command/clean.html">clean</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/cloneCollection.html">cloneCollection</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/cloneCollectionAsCapped.html">cloneCollectionAsCapped</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/collMod.html">collMod</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/compact.html">compact</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/connPoolSync.html">connPoolSync</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/convertToCapped.html">convertToCapped</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/create.html">create</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/createIndexes.html">createIndexes</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/currentOp.html">currentOp</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/drop.html">drop</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/dropDatabase.html">dropDatabase</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/dropConnections.html">dropConnections</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/dropIndexes.html">dropIndexes</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/filemd5.html">filemd5</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/fsync.html">fsync</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/fsyncUnlock.html">fsyncUnlock</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/getParameter.html">getParameter</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/killCursors.html">killCursors</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/killOp.html">killOp</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/listCollections.html">listCollections</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/listDatabases.html">listDatabases</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/listIndexes.html">listIndexes</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/logRotate.html">logRotate</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/reIndex.html">reIndex</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/renameCollection.html">renameCollection</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/setFeatureCompatibilityVersion.html">setFeatureCompatibilityVersion</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/setParameter.html">setParameter</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/shutdown.html">shutdown</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/command/nav-diagnostic.html">Diagnostic Commands</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/command/availableQueryOptions.html">availableQueryOptions</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/buildInfo.html">buildInfo</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/collStats.html">collStats</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/connPoolStats.html">connPoolStats</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/connectionStatus.html">connectionStatus</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/cursorInfo.html">cursorInfo</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/dataSize.html">dataSize</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/dbHash.html">dbHash</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/dbStats.html">dbStats</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/diagLogging.html">diagLogging</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/driverOIDTest.html">driverOIDTest</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/explain.html">explain</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/features.html">features</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/getCmdLineOpts.html">getCmdLineOpts</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/getLog.html">getLog</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/hostInfo.html">hostInfo</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/isSelf.html">isSelf</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/listCommands.html">listCommands</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/netstat.html">netstat</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/ping.html">ping</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/profile.html">profile</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/serverStatus.html">serverStatus</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/shardConnPoolStats.html">shardConnPoolStats</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/top.html">top</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/validate.html">validate</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/whatsmyuri.html">whatsmyuri</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/command/nav-free-monitoring.html">Free Monitoring Commands</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/command/getFreeMonitoringStatus.html">getFreeMonitoringStatus</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/command/setFreeMonitoring.html">setFreeMonitoring</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/command/nav-auditing.html">System Events Auditing Commands</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/command/logApplicationMessage.html">logApplicationMessage</a></li></ul></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../reference/method.html"><code class="docutils literal"><span class="pre">mongo</span></code> Shell Methods</a><ul><li class="toctree-l3"><a class="reference internal" href="../reference/method/js-collection.html">Collection Methods</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.aggregate.html">db.collection.aggregate()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.bulkWrite.html">db.collection.bulkWrite()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.copyTo.html">db.collection.copyTo()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.count.html">db.collection.count()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.countDocuments.html">db.collection.countDocuments()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.estimatedDocumentCount.html">db.collection.estimatedDocumentCount()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.createIndex.html">db.collection.createIndex()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.createIndexes.html">db.collection.createIndexes()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.dataSize.html">db.collection.dataSize()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.deleteOne.html">db.collection.deleteOne()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.deleteMany.html">db.collection.deleteMany()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.distinct.html">db.collection.distinct()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.drop.html">db.collection.drop()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.dropIndex.html">db.collection.dropIndex()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.dropIndexes.html">db.collection.dropIndexes()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.ensureIndex.html">db.collection.ensureIndex()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.explain.html">db.collection.explain()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.find.html">db.collection.find()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.findAndModify.html">db.collection.findAndModify()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.findOne.html">db.collection.findOne()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.findOneAndDelete.html">db.collection.findOneAndDelete()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.findOneAndReplace.html">db.collection.findOneAndReplace()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.findOneAndUpdate.html">db.collection.findOneAndUpdate()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.getIndexes.html">db.collection.getIndexes()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.getShardDistribution.html">db.collection.getShardDistribution()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.getShardVersion.html">db.collection.getShardVersion()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.insert.html">db.collection.insert()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.insertOne.html">db.collection.insertOne()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.insertMany.html">db.collection.insertMany()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.isCapped.html">db.collection.isCapped()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.latencyStats.html">db.collection.latencyStats()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.mapReduce.html">db.collection.mapReduce()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.reIndex.html">db.collection.reIndex()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.remove.html">db.collection.remove()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.renameCollection.html">db.collection.renameCollection()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.replaceOne.html">db.collection.replaceOne()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.save.html">db.collection.save()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.stats.html">db.collection.stats()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.storageSize.html">db.collection.storageSize()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.totalIndexSize.html">db.collection.totalIndexSize()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.totalSize.html">db.collection.totalSize()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.update.html">db.collection.update()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.updateOne.html">db.collection.updateOne()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.updateMany.html">db.collection.updateMany()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.watch.html">db.collection.watch()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.validate.html">db.collection.validate()</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/method/js-cursor.html">Cursor Methods</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.addOption.html">cursor.addOption()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.allowPartialResults.html">cursor.allowPartialResults()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.batchSize.html">cursor.batchSize()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.close.html">cursor.close()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.isClosed.html">cursor.isClosed()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.collation.html">cursor.collation()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.comment.html">cursor.comment()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.count.html">cursor.count()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.explain.html">cursor.explain()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.forEach.html">cursor.forEach()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.hasNext.html">cursor.hasNext()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.hint.html">cursor.hint()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.isExhausted.html">cursor.isExhausted()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.itcount.html">cursor.itcount()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.limit.html">cursor.limit()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.map.html">cursor.map()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.max.html">cursor.max()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.maxTimeMS.html">cursor.maxTimeMS()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.min.html">cursor.min()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.next.html">cursor.next()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.noCursorTimeout.html">cursor.noCursorTimeout()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.objsLeftInBatch.html">cursor.objsLeftInBatch()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.pretty.html">cursor.pretty()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.readConcern.html">cursor.readConcern()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.readPref.html">cursor.readPref()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.returnKey.html">cursor.returnKey()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.showRecordId.html">cursor.showRecordId()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.size.html">cursor.size()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.skip.html">cursor.skip()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.sort.html">cursor.sort()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.tailable.html">cursor.tailable()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cursor.toArray.html">cursor.toArray()</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/method/js-database.html">Database Methods</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.adminCommand.html">db.adminCommand()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.aggregate.html">db.aggregate()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.cloneCollection.html">db.cloneCollection()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.cloneDatabase.html">db.cloneDatabase()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.commandHelp.html">db.commandHelp()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.copyDatabase.html">db.copyDatabase()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.createCollection.html">db.createCollection()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.createView.html">db.createView()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.currentOp.html">db.currentOp()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.dropDatabase.html">db.dropDatabase()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.eval.html">db.eval()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.fsyncLock.html">db.fsyncLock()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.fsyncUnlock.html">db.fsyncUnlock()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.getCollection.html">db.getCollection()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.getCollectionInfos.html">db.getCollectionInfos()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.getCollectionNames.html">db.getCollectionNames()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.getLastError.html">db.getLastError()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.getLastErrorObj.html">db.getLastErrorObj()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.getLogComponents.html">db.getLogComponents()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.getMongo.html">db.getMongo()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.getName.html">db.getName()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.getProfilingLevel.html">db.getProfilingLevel()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.getProfilingStatus.html">db.getProfilingStatus()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.getReplicationInfo.html">db.getReplicationInfo()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.getSiblingDB.html">db.getSiblingDB()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.help.html">db.help()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.hostInfo.html">db.hostInfo()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.isMaster.html">db.isMaster()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.killOp.html">db.killOp()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.listCommands.html">db.listCommands()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.logout.html">db.logout()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.printCollectionStats.html">db.printCollectionStats()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.printReplicationInfo.html">db.printReplicationInfo()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.printShardingStatus.html">db.printShardingStatus()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.printSlaveReplicationInfo.html">db.printSlaveReplicationInfo()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.resetError.html">db.resetError()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.runCommand.html">db.runCommand()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.serverBuildInfo.html">db.serverBuildInfo()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.serverCmdLineOpts.html">db.serverCmdLineOpts()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.serverStatus.html">db.serverStatus()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.setLogLevel.html">db.setLogLevel()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.setProfilingLevel.html">db.setProfilingLevel()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.shutdownServer.html">db.shutdownServer()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.stats.html">db.stats()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.version.html">db.version()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.watch.html">db.watch()</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/method/js-plan-cache.html">Query Plan Cache Methods</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.getPlanCache.html">db.collection.getPlanCache()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/PlanCache.clear.html">PlanCache.clear()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/PlanCache.clearPlansByQuery.html">PlanCache.clearPlansByQuery()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/PlanCache.getPlansByQuery.html">PlanCache.getPlansByQuery()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/PlanCache.help.html">PlanCache.help()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/PlanCache.listQueryShapes.html">PlanCache.listQueryShapes()</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/method/js-bulk.html">Bulk Operation Methods</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.initializeOrderedBulkOp.html">db.collection.initializeOrderedBulkOp()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.collection.initializeUnorderedBulkOp.html">db.collection.initializeUnorderedBulkOp()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Bulk.html">Bulk()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Bulk.execute.html">Bulk.execute()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Bulk.find.html">Bulk.find()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Bulk.find.arrayFilters.html">Bulk.find.arrayFilters()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Bulk.find.collation.html">Bulk.find.collation()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Bulk.find.hint.html">Bulk.find.hint()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Bulk.find.remove.html">Bulk.find.remove()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Bulk.find.removeOne.html">Bulk.find.removeOne()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Bulk.find.replaceOne.html">Bulk.find.replaceOne()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Bulk.find.updateOne.html">Bulk.find.updateOne()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Bulk.find.update.html">Bulk.find.update()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Bulk.find.upsert.html">Bulk.find.upsert()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Bulk.getOperations.html">Bulk.getOperations()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Bulk.insert.html">Bulk.insert()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Bulk.tojson.html">Bulk.tojson()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Bulk.toString.html">Bulk.toString()</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/method/js-user-management.html">User Management Methods</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.auth.html">db.auth()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.changeUserPassword.html">db.changeUserPassword()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.createUser.html">db.createUser()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.dropUser.html">db.dropUser()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.dropAllUsers.html">db.dropAllUsers()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.getUser.html">db.getUser()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.getUsers.html">db.getUsers()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.grantRolesToUser.html">db.grantRolesToUser()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.removeUser.html">db.removeUser()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.revokeRolesFromUser.html">db.revokeRolesFromUser()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.updateUser.html">db.updateUser()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/passwordPrompt.html">passwordPrompt()</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/method/js-role-management.html">Role Management Methods</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.createRole.html">db.createRole()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.dropRole.html">db.dropRole()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.dropAllRoles.html">db.dropAllRoles()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.getRole.html">db.getRole()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.getRoles.html">db.getRoles()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.grantPrivilegesToRole.html">db.grantPrivilegesToRole()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.revokePrivilegesFromRole.html">db.revokePrivilegesFromRole()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.grantRolesToRole.html">db.grantRolesToRole()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.revokeRolesFromRole.html">db.revokeRolesFromRole()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.updateRole.html">db.updateRole()</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/method/js-replication.html">Replication Methods</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/method/rs.add.html">rs.add()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/rs.addArb.html">rs.addArb()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/rs.conf.html">rs.conf()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/rs.freeze.html">rs.freeze()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/rs.help.html">rs.help()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/rs.initiate.html">rs.initiate()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/rs.printReplicationInfo.html">rs.printReplicationInfo()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/rs.printSlaveReplicationInfo.html">rs.printSlaveReplicationInfo()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/rs.reconfig.html">rs.reconfig()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/rs.remove.html">rs.remove()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/rs.slaveOk.html">rs.slaveOk()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/rs.status.html">rs.status()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/rs.stepDown.html">rs.stepDown()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/rs.syncFrom.html">rs.syncFrom()</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/method/js-sharding.html">Sharding Methods</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.addShard.html">sh.addShard()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.addShardTag.html">sh.addShardTag()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.addShardToZone.html">sh.addShardToZone()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.addTagRange.html">sh.addTagRange()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.disableBalancing.html">sh.disableBalancing()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.enableBalancing.html">sh.enableBalancing()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.disableAutoSplit.html">sh.disableAutoSplit</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.enableAutoSplit.html">sh.enableAutoSplit</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.enableSharding.html">sh.enableSharding()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.getBalancerHost.html">sh.getBalancerHost()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.getBalancerState.html">sh.getBalancerState()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.removeTagRange.html">sh.removeTagRange()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.removeRangeFromZone.html">sh.removeRangeFromZone()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.help.html">sh.help()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.isBalancerRunning.html">sh.isBalancerRunning()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.moveChunk.html">sh.moveChunk()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.removeShardTag.html">sh.removeShardTag()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.removeShardFromZone.html">sh.removeShardFromZone()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.setBalancerState.html">sh.setBalancerState()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.shardCollection.html">sh.shardCollection()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.splitAt.html">sh.splitAt()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.splitFind.html">sh.splitFind()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.startBalancer.html">sh.startBalancer()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.status.html">sh.status()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.stopBalancer.html">sh.stopBalancer()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.waitForBalancer.html">sh.waitForBalancer()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.waitForBalancerOff.html">sh.waitForBalancerOff()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.waitForPingChange.html">sh.waitForPingChange()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sh.updateZoneKeyRange.html">sh.updateZoneKeyRange()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/convertShardKeyToHashed.html">convertShardKeyToHashed</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/method/js-free-monitoring.html">Free Monitoring Methods</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.disableFreeMonitoring.html">db.disableFreeMonitoring()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.enableFreeMonitoring.html">db.enableFreeMonitoring()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/db.getFreeMonitoringStatus.html">db.getFreeMonitoringStatus</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/method/js-constructor.html">Object Constructors and Methods</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/method/BulkWriteResult.html">BulkWriteResult()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Date.html">Date()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/ObjectId.html">ObjectId</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/ObjectId.getTimestamp.html">ObjectId.getTimestamp()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/ObjectId.toString.html">ObjectId.toString()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/ObjectId.valueOf.html">ObjectId.valueOf()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/UUID.html">UUID()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/WriteResult.html">WriteResult()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/WriteResult.hasWriteError.html">WriteResult.hasWriteError()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/WriteResult.hasWriteConcernError.html">WriteResult.hasWriteConcernError()</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/method/js-connection.html">Connection Methods</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/method/connect.html">connect()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Mongo.html">Mongo()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Mongo.getDB.html">Mongo.getDB()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Mongo.getReadPrefMode.html">Mongo.getReadPrefMode()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Mongo.getReadPrefTagSet.html">Mongo.getReadPrefTagSet()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Mongo.isCausalConsistency.html">Mongo.isCausalConsistency()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Mongo.setCausalConsistency.html">Mongo.setCausalConsistency()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Mongo.setReadPref.html">Mongo.setReadPref()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Mongo.setSlaveOk.html">Mongo.setSlaveOk()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Mongo.startSession.html">Mongo.startSession()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Mongo.watch.html">Mongo.watch()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/Session.html">Session</a><ul><li class="toctree-l5"><a class="reference internal" href="../reference/method/Session.abortTransaction.html">Session.abortTransaction()</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/method/Session.commitTransaction.html">Session.commitTransaction()</a></li><li class="toctree-l5"><a class="reference internal" href="../reference/method/Session.startTransaction.html">Session.startTransaction()</a></li></ul></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/SessionOptions.html">SessionOptions</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/method/js-native.html">Native Methods</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/method/cat.html">cat()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/cd.html">cd()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/copyDbpath.html">copyDbpath()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/getHostName.html">getHostName()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/getMemInfo.html">getMemInfo()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/hostname.html">hostname()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/isInteractive.html">isInteractive()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/listFiles.html">listFiles()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/load.html">load()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/ls.html">ls()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/md5sumFile.html">md5sumFile()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/mkdir.html">mkdir()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/pwd.html">pwd()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/quit.html">quit()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/removeFile.html">removeFile()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/resetDbpath.html">resetDbpath()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/sleep.html">sleep()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/setVerboseShell.html">setVerboseShell()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/version.html">version()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/isWindows.html">_isWindows()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/rand.html">_rand()</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../reference/method/js-client-side-field-level-encryption.html">Client-Side Field Level Encryption Methods</a><ul><li class="toctree-l4"><a class="reference internal" href="../reference/method/getKeyVault.html">getKeyVault()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/KeyVault.createKey.html">KeyVault.createKey()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/KeyVault.deleteKey.html">KeyVault.deleteKey()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/KeyVault.getKey.html">KeyVault.getKey()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/KeyVault.getKeys.html">KeyVault.getKeys()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/KeyVault.addKeyAlternateName.html">KeyVault.addKeyAlternateName()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/KeyVault.removeKeyAlternateName.html">KeyVault.removeKeyAlternateName()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/KeyVault.getKeyByAltName.html">KeyVault.getKeyByAltName()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/getClientEncryption.html">getClientEncryption()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/ClientEncryption.encrypt.html">ClientEncryption.encrypt()</a></li><li class="toctree-l4"><a class="reference internal" href="../reference/method/ClientEncryption.decrypt.html">ClientEncryption.decrypt()</a></li></ul></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../reference/program.html">MongoDB Package Components</a><ul><li class="toctree-l3"><a class="reference internal" href="../reference/program/mongod.html"><code class="docutils literal"><span class="pre">mongod</span></code></a></li><li class="toctree-l3"><a class="reference internal" href="../reference/program/mongos.html"><code class="docutils literal"><span class="pre">mongos</span></code></a></li><li class="toctree-l3"><a class="reference internal" href="../reference/program/mongo.html"><code class="docutils literal"><span class="pre">mongo</span></code></a></li><li class="toctree-l3"><a class="reference internal" href="../reference/program/mongod.exe.html"><code class="docutils literal"><span class="pre">mongod.exe</span></code></a></li><li class="toctree-l3"><a class="reference internal" href="../reference/program/mongos.exe.html"><code class="docutils literal"><span class="pre">mongos.exe</span></code></a></li><li class="toctree-l3"><a class="reference internal" href="../reference/program/mongodump.html"><code class="docutils literal"><span class="pre">mongodump</span></code></a></li><li class="toctree-l3"><a class="reference internal" href="../reference/program/mongorestore.html"><code class="docutils literal"><span class="pre">mongorestore</span></code></a></li><li class="toctree-l3"><a class="reference internal" href="../reference/program/bsondump.html"><code class="docutils literal"><span class="pre">bsondump</span></code></a></li><li class="toctree-l3"><a class="reference internal" href="../reference/program/mongoimport.html"><code class="docutils literal"><span class="pre">mongoimport</span></code></a></li><li class="toctree-l3"><a class="reference internal" href="../reference/program/mongoexport.html"><code class="docutils literal"><span class="pre">mongoexport</span></code></a></li><li class="toctree-l3"><a class="reference internal" href="../reference/program/mongostat.html"><code class="docutils literal"><span class="pre">mongostat</span></code></a></li><li class="toctree-l3"><a class="reference internal" href="../reference/program/mongotop.html"><code class="docutils literal"><span class="pre">mongotop</span></code></a></li><li class="toctree-l3"><a class="reference internal" href="../reference/program/mongoreplay.html"><code class="docutils literal"><span class="pre">mongoreplay</span></code></a></li><li class="toctree-l3"><a class="reference internal" href="../reference/program/mongoldap.html"><code class="docutils literal"><span class="pre">mongoldap</span></code></a></li><li class="toctree-l3"><a class="reference internal" href="../reference/program/mongofiles.html"><code class="docutils literal"><span class="pre">mongofiles</span></code></a></li><li class="toctree-l3"><a class="reference internal" href="../reference/program/install_compass.html"><code class="docutils literal"><span class="pre">install_compass</span></code></a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../reference/configuration-options.html">Configuration File Options</a><ul><li class="toctree-l3"><a class="reference internal" href="../reference/expansion-directives.html">Externally Sourced Configuration File Values</a></li><li class="toctree-l3"><a class="reference internal" href="../tutorial/convert-command-line-options-to-yaml.html">Convert Command-Line Options to YAML</a></li><li class="toctree-l3"><a class="reference internal" href="../reference/configuration-file-settings-command-line-options-mapping.html">Configuration File Settings and Command-Line Options Mapping</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../reference/parameters.html">MongoDB Server Parameters</a></li><li class="toctree-l2"><a class="reference internal" href="../reference/limits.html">MongoDB Limits and Thresholds</a></li><li class="toctree-l2"><a class="reference internal" href="../reference/explain-results.html">Explain Results</a></li><li class="toctree-l2"><a class="reference internal" href="../reference/system-collections.html">System Collections</a></li><li class="toctree-l2"><a class="reference internal" href="../reference/connection-string.html">Connection String URI Format</a></li><li class="toctree-l2"><a class="reference internal" href="../reference/collation.html">Collation</a><ul><li class="toctree-l3"><a class="reference internal" href="../reference/collation-locales-defaults.html">Collation Locales and Default Parameters</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../reference/mongodb-wire-protocol.html">MongoDB Wire Protocol</a></li><li class="toctree-l2"><a class="reference internal" href="../reference/log-messages.html">Log Messages</a></li><li class="toctree-l2"><a class="reference internal" href="../reference/exit-codes.html">Exit Codes and Statuses</a></li><li class="toctree-l2"><a class="reference internal" href="../reference/glossary.html">Glossary</a></li><li class="toctree-l2"><a class="reference internal" href="../reference/default-mongodb-port.html">Default MongoDB Port</a></li><li class="toctree-l2"><a class="reference internal" href="../reference/server-sessions.html">Server Sessions</a></li></ul></li><li class="toctree-l1"><a class="reference internal" href="../release-notes.html">Release Notes</a><ul><li class="toctree-l2"><a class="reference internal" href="../release-notes/4.2.html">Release Notes for MongoDB 4.2</a><ul><li class="toctree-l3"><a class="reference internal" href="../release-notes/4.2-compatibility.html">Compatibility Changes in MongoDB 4.2</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/4.2-upgrade-standalone.html">Upgrade a Standalone to 4.2</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/4.2-upgrade-replica-set.html">Upgrade a Replica Set to 4.2</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/4.2-upgrade-sharded-cluster.html">Upgrade a Sharded Cluster to 4.2</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/4.2-downgrade.html">Downgrade 4.2 to 4.0</a><ul><li class="toctree-l4"><a class="reference internal" href="../release-notes/4.2-downgrade-standalone.html">Downgrade 4.2 Standalone to 4.0</a></li><li class="toctree-l4"><a class="reference internal" href="../release-notes/4.2-downgrade-replica-set.html">Downgrade 4.2 Replica Set to 4.0</a></li><li class="toctree-l4"><a class="reference internal" href="../release-notes/4.2-downgrade-sharded-cluster.html">Downgrade 4.2 Sharded Cluster to 4.0</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/4.2-changelog.html">4.2 Changelog</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../release-notes/4.0.html">Release Notes for MongoDB 4.0</a><ul><li class="toctree-l3"><a class="reference internal" href="../release-notes/4.0-compatibility.html">Compatibility Changes in MongoDB 4.0</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/4.0-upgrade-standalone.html">Upgrade a Standalone to 4.0</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/4.0-upgrade-replica-set.html">Upgrade a Replica Set to 4.0</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/4.0-upgrade-sharded-cluster.html">Upgrade a Sharded Cluster to 4.0</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/4.0-downgrade-standalone.html">Downgrade 4.0 Standalone to 3.6</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/4.0-downgrade-replica-set.html">Downgrade 4.0 Replica Set to 3.6</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/4.0-downgrade-sharded-cluster.html">Downgrade 4.0 Sharded Cluster to 3.6</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/4.0-changelog.html">4.0 Changelog</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../release-notes/3.6.html">Release Notes for MongoDB 3.6</a><ul><li class="toctree-l3"><a class="reference internal" href="../release-notes/3.6-changelog.html">3.6 Changelog</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/3.6-compatibility.html">Compatibility Changes in MongoDB 3.6</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/3.6-upgrade-standalone.html">Upgrade a Standalone to 3.6</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/3.6-upgrade-replica-set.html">Upgrade a Replica Set to 3.6</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/3.6-upgrade-sharded-cluster.html">Upgrade a Sharded Cluster to 3.6</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/3.6-downgrade-standalone.html">Downgrade 3.6 Standalone to 3.4</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/3.6-downgrade-replica-set.html">Downgrade 3.6 Replica Set to 3.4</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/3.6-downgrade-sharded-cluster.html">Downgrade 3.6 Sharded Cluster to 3.4</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../release-notes/3.4.html">Release Notes for MongoDB 3.4</a><ul><li class="toctree-l3"><a class="reference internal" href="../release-notes/3.4-changelog.html">3.4 Changelog</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/3.4-compatibility.html">Compatibility Changes in MongoDB 3.4</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/3.4-upgrade-standalone.html">Upgrade a Standalone to 3.4</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/3.4-upgrade-replica-set.html">Upgrade a Replica Set to 3.4</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/3.4-upgrade-sharded-cluster.html">Upgrade a Sharded Cluster to 3.4</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/3.4-downgrade.html">Downgrade MongoDB 3.4 to 3.2</a><ul><li class="toctree-l4"><a class="reference internal" href="../release-notes/3.4-downgrade-standalone.html">Downgrade 3.4 Standalone to 3.2</a></li><li class="toctree-l4"><a class="reference internal" href="../release-notes/3.4-downgrade-replica-set.html">Downgrade 3.4 Replica Set to 3.2</a></li><li class="toctree-l4"><a class="reference internal" href="../release-notes/3.4-downgrade-sharded-cluster.html">Downgrade 3.4 Sharded Cluster to 3.2</a></li></ul></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../release-notes/3.2.html">Release Notes for MongoDB 3.2</a><ul><li class="toctree-l3"><a class="reference internal" href="../release-notes/3.2-changelog.html">3.2 Changelog</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/3.2-compatibility.html">Compatibility Changes in MongoDB 3.2</a><ul><li class="toctree-l4"><a class="reference internal" href="../release-notes/3.2-javascript.html">JavaScript Changes in MongoDB 3.2</a></li></ul></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/3.2-upgrade.html">Upgrade MongoDB to 3.2</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/3.2-downgrade.html">Downgrade MongoDB from 3.2</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../release-notes/3.0.html">Release Notes for MongoDB 3.0</a><ul><li class="toctree-l3"><a class="reference internal" href="../release-notes/3.0-changelog.html">3.0 Changelog</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/3.0-compatibility.html">Compatibility Changes in MongoDB 3.0</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/3.0-upgrade.html">Upgrade MongoDB to 3.0</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/3.0-scram.html">Upgrade to SCRAM</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/3.0-downgrade.html">Downgrade MongoDB from 3.0</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../release-notes/2.6.html">Release Notes for MongoDB 2.6</a><ul><li class="toctree-l3"><a class="reference internal" href="../release-notes/2.6-changelog.html">2.6 Changelog</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/2.6-compatibility.html">Compatibility Changes in MongoDB 2.6</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/2.6-upgrade.html">Upgrade MongoDB to 2.6</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/2.6-upgrade-authorization.html">Upgrade User Authorization Data to 2.6 Format</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/2.6-downgrade.html">Downgrade MongoDB from 2.6</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../release-notes/2.4.html">Release Notes for MongoDB 2.4</a><ul><li class="toctree-l3"><a class="reference internal" href="../release-notes/2.4-changelog.html">2.4 Changelog</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/2.4-javascript.html">JavaScript Changes in MongoDB 2.4</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/2.4-upgrade.html">Upgrade MongoDB to 2.4</a></li><li class="toctree-l3"><a class="reference internal" href="../release-notes/2.4-index-types.html">Compatibility and Index Type Changes in MongoDB 2.4</a></li></ul></li><li class="toctree-l2"><a class="reference internal" href="../release-notes/2.2.html">Release Notes for MongoDB 2.2</a></li><li class="toctree-l2"><a class="reference internal" href="../release-notes/2.0.html">Release Notes for MongoDB 2.0</a></li><li class="toctree-l2"><a class="reference internal" href="../release-notes/1.8.html">Release Notes for MongoDB 1.8</a></li><li class="toctree-l2"><a class="reference internal" href="../release-notes/1.6.html">Release Notes for MongoDB 1.6</a></li><li class="toctree-l2"><a class="reference internal" href="../release-notes/1.4.html">Release Notes for MongoDB 1.4</a></li><li class="toctree-l2"><a class="reference internal" href="../release-notes/1.2.html">Release Notes for MongoDB 1.2.x</a></li><li class="toctree-l2"><a class="reference internal" href="../reference/versioning.html">MongoDB Versioning</a></li></ul></li><li class="toctree-l1"><a class="reference internal" href="../support.html">Technical Support</a></li></ul>


    </div>
  </div>
           
         </aside>

   </div>

    <div id="main-column" class="main-column">

    <span id="showNav" class="showNav">Navigation</span>

      
        <div class="document">
            <div class="documentwrapper"><div class="bodywrapper">
              <div class="body" data-pagename="core/transactions">
                   <a class="edit-link" href="https://github.com/mongodb/docs/blob/v4.2/source/core/transactions.txt" target="_blank" title="Edit core/transactions.txt on GitHub">
    
      <span class="icon-edit"></span>
    
  </a>
                

                
  <div class="bc">
    
      
    
    
  </div>
                
                  <div class="section" id="transactions">
<h1>Transactions<a class="headerlink" href="#transactions" title="Permalink to this headline">¶</a></h1>
<div class="contents twocols local topic" id="on-this-page">
<p class="topic-title first">On this page</p>
<ul class="simple">
<li><a class="reference internal" href="#transactions-api" id="id1">Transactions API</a></li>
<li><a class="reference internal" href="#transactions-and-atomicity" id="id2">Transactions and Atomicity</a></li>
<li><a class="reference internal" href="#transactions-and-operations" id="id3">Transactions and Operations</a></li>
<li><a class="reference internal" href="#transactions-and-sessions" id="id4">Transactions and Sessions</a></li>
<li><a class="reference internal" href="#read-concern-write-concern-read-preference" id="id5">Read Concern/Write Concern/Read Preference</a></li>
<li><a class="reference internal" href="#general-information" id="id6">General Information</a></li>
<li><a class="reference internal" href="#additional-transactions-topics" id="id7">Additional Transactions Topics</a></li>
</ul>
</div>
<p>In MongoDB, an operation on a single document is atomic. Because you can
use embedded documents and arrays to capture relationships between data
in a single document structure instead of normalizing across multiple
documents and collections, this single-document atomicity obviates the
need for multi-document transactions for many practical use cases.</p>
<p>For situations that require atomicity of reads and writes to multiple
documents (in a single or multiple collections), MongoDB supports
multi-document transactions. With distributed transactions,
transactions can be used across multiple operations, collections,
databases, documents, and shards.</p>
<div class="section" id="transactions-api">
<h2>Transactions API<a class="headerlink" href="#transactions-api" title="Permalink to this headline">¶</a></h2>
<p>The following example highlights the key components
of the transactions API:</p>
<ul class="guide__pills pillstrip-declaration" role="tablist" data-tab-preference="languages"></ul><div class="tabs" data-tab-preference="languages">
  <ul class="tab-strip tab-strip--singleton" role="tablist">
    <li class="tab-strip__element" data-tabid="python" role="tab" aria-selected="true">Python</li>
    <li class="tab-strip__element" data-tabid="javasync" role="tab" aria-selected="false">Java (Sync)</li>
    <li class="tab-strip__element" data-tabid="nodejs" role="tab" aria-selected="false">Node.js</li>
    <li class="tab-strip__element" data-tabid="php" role="tab" aria-selected="false">PHP</li>
    <li class="tab-strip__element" data-tabid="motor" role="tab" aria-selected="false">Motor</li>
    <li class="tab-strip__element dropdown">
      <a class="dropdown-toggle" data-toggle="dropdown">Other <span class="caret"></span></a>
      <ul class="dropdown-menu tab-strip__dropdown" role="menu">
        <li data-tabid="c" aria-selected="false">C</li>
        <li data-tabid="cpp" aria-selected="false">C++11</li>
        <li data-tabid="csharp" aria-selected="false">C#</li>
      </ul>
    </li>
  </ul>
  <div class="tabs__content" role="tabpanel">
    <div class="tabpanel-python" data-tabid="python"><p>The example uses the new callback API for working with
transactions, which starts a transaction, executes the
specified operations, and commits (or aborts on error). The
new callback API also incorporates retry logic for
<code class="docutils literal"><span class="pre">TransientTransactionError</span></code> or
<code class="docutils literal"><span class="pre">UnknownTransactionCommitResult</span></code> commit errors.</p>
<div class="admonition important">
<p class="first admonition-title">Important</p>
<ul class="last simple">
<li>For transactions on MongoDB 4.2 deployments (replica
sets and sharded clusters), clients <strong class="text-danger">must</strong> use
MongoDB drivers updated for MongoDB 4.2.</li>
<li>When using the drivers, each operation in the
transaction must be associated with the session (i.e.
pass in the session to each operation).</li>
</ul>
</div>
<div class="button-code-block">
<div class="button-row">
<a class="code-button--copy code-button" role="button">
copy</a>
</div>
<div class="copyable-code-block highlight-python"><div class="highlight"><pre><span></span>
<span class="c1"># For a replica set, include the replica set name and a seedlist of the members in the URI string; e.g.</span>
<span class="c1"># uriString = &#39;mongodb://mongodb0.example.com:27017,mongodb1.example.com:27017/?replicaSet=myRepl&#39;</span>
<span class="c1"># For a sharded cluster, connect to the mongos instances; e.g.</span>
<span class="c1"># uriString = &#39;mongodb://mongos0.example.com:27017,mongos1.example.com:27017/&#39;</span>

<span class="n">client</span> <span class="o">=</span> <span class="n">MongoClient</span><span class="p">(</span><span class="n">uriString</span><span class="p">)</span>
<span class="n">wc_majority</span> <span class="o">=</span> <span class="n">WriteConcern</span><span class="p">(</span><span class="s2">&quot;majority&quot;</span><span class="p">,</span> <span class="n">wtimeout</span><span class="o">=</span><span class="mi">1000</span><span class="p">)</span>

<span class="c1"># Prereq: Create collections. CRUD operations in transactions must be on existing collections.</span>
<span class="n">client</span><span class="o">.</span><span class="n">get_database</span><span class="p">(</span>
    <span class="s2">&quot;mydb1&quot;</span><span class="p">,</span> <span class="n">write_concern</span><span class="o">=</span><span class="n">wc_majority</span><span class="p">)</span><span class="o">.</span><span class="n">foo</span><span class="o">.</span><span class="n">insert_one</span><span class="p">({</span><span class="s1">&#39;abc&#39;</span><span class="p">:</span> <span class="mi">0</span><span class="p">})</span>
<span class="n">client</span><span class="o">.</span><span class="n">get_database</span><span class="p">(</span>
    <span class="s2">&quot;mydb2&quot;</span><span class="p">,</span> <span class="n">write_concern</span><span class="o">=</span><span class="n">wc_majority</span><span class="p">)</span><span class="o">.</span><span class="n">bar</span><span class="o">.</span><span class="n">insert_one</span><span class="p">({</span><span class="s1">&#39;xyz&#39;</span><span class="p">:</span> <span class="mi">0</span><span class="p">})</span>

<span class="c1"># Step 1: Define the callback that specifies the sequence of operations to perform inside the transactions.</span>
<span class="k">def</span> <span class="nf">callback</span><span class="p">(</span><span class="n">session</span><span class="p">):</span>
    <span class="n">collection_one</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">mydb1</span><span class="o">.</span><span class="n">foo</span>
    <span class="n">collection_two</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">mydb2</span><span class="o">.</span><span class="n">bar</span>

    <span class="c1"># Important:: You must pass the session to the operations.</span>
    <span class="n">collection_one</span><span class="o">.</span><span class="n">insert_one</span><span class="p">({</span><span class="s1">&#39;abc&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">},</span> <span class="n">session</span><span class="o">=</span><span class="n">session</span><span class="p">)</span>
    <span class="n">collection_two</span><span class="o">.</span><span class="n">insert_one</span><span class="p">({</span><span class="s1">&#39;xyz&#39;</span><span class="p">:</span> <span class="mi">999</span><span class="p">},</span> <span class="n">session</span><span class="o">=</span><span class="n">session</span><span class="p">)</span>

<span class="c1"># Step 2: Start a client session.</span>
<span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">start_session</span><span class="p">()</span> <span class="k">as</span> <span class="n">session</span><span class="p">:</span>
    <span class="c1"># Step 3: Use with_transaction to start a transaction, execute the callback, and commit (or abort on error).</span>
    <span class="n">session</span><span class="o">.</span><span class="n">with_transaction</span><span class="p">(</span>
        <span class="n">callback</span><span class="p">,</span> <span class="n">read_concern</span><span class="o">=</span><span class="n">ReadConcern</span><span class="p">(</span><span class="s1">&#39;local&#39;</span><span class="p">),</span>
        <span class="n">write_concern</span><span class="o">=</span><span class="n">wc_majority</span><span class="p">,</span>
        <span class="n">read_preference</span><span class="o">=</span><span class="n">ReadPreference</span><span class="o">.</span><span class="n">PRIMARY</span><span class="p">)</span>

</pre></div>
</div>
</div>
</div>
<div class="tabpanel-javasync" data-tabid="javasync"><p>The example uses the new callback API for working with
transactions, which starts a transaction, executes the
specified operations, and commits (or aborts on error). The
new callback API also incorporates retry logic for
<code class="docutils literal"><span class="pre">TransientTransactionError</span></code> or
<code class="docutils literal"><span class="pre">UnknownTransactionCommitResult</span></code> commit errors.</p>
<div class="admonition important">
<p class="first admonition-title">Important</p>
<ul class="last simple">
<li>For transactions on MongoDB 4.2 deployments (replica
sets and sharded clusters), clients <strong class="text-danger">must</strong> use
MongoDB drivers updated for MongoDB 4.2.</li>
<li>When using the drivers, each operation in the
transaction must be associated with the session (i.e.
pass in the session to each operation).</li>
</ul>
</div>
<div class="button-code-block">
<div class="button-row">
<a class="code-button--copy code-button" role="button">
copy</a>
</div>
<div class="copyable-code-block highlight-java"><div class="highlight"><pre><span></span><span class="cm">/*</span>
<span class="cm">  For a replica set, include the replica set name and a seedlist of the members in the URI string; e.g.</span>
<span class="cm">  String uri = &quot;mongodb://mongodb0.example.com:27017,mongodb1.example.com:27017/admin?replicaSet=myRepl&quot;;</span>
<span class="cm">  For a sharded cluster, connect to the mongos instances; e.g.</span>
<span class="cm">  String uri = &quot;mongodb://mongos0.example.com:27017,mongos1.example.com:27017:27017/admin&quot;;</span>
<span class="cm"> */</span>

<span class="kd">final</span> <span class="n">MongoClient</span> <span class="n">client</span> <span class="o">=</span> <span class="n">MongoClients</span><span class="o">.</span><span class="na">create</span><span class="o">(</span><span class="n">uri</span><span class="o">);</span>

<span class="cm">/*</span>
<span class="cm">    Prereq: Create collections. CRUD operations in transactions must be on existing collections.</span>
<span class="cm"> */</span>

<span class="n">client</span><span class="o">.</span><span class="na">getDatabase</span><span class="o">(</span><span class="s">&quot;mydb1&quot;</span><span class="o">).</span><span class="na">getCollection</span><span class="o">(</span><span class="s">&quot;foo&quot;</span><span class="o">)</span>
        <span class="o">.</span><span class="na">withWriteConcern</span><span class="o">(</span><span class="n">WriteConcern</span><span class="o">.</span><span class="na">MAJORITY</span><span class="o">).</span><span class="na">insertOne</span><span class="o">(</span><span class="k">new</span> <span class="n">Document</span><span class="o">(</span><span class="s">&quot;abc&quot;</span><span class="o">,</span> <span class="mi">0</span><span class="o">));</span>
<span class="n">client</span><span class="o">.</span><span class="na">getDatabase</span><span class="o">(</span><span class="s">&quot;mydb2&quot;</span><span class="o">).</span><span class="na">getCollection</span><span class="o">(</span><span class="s">&quot;bar&quot;</span><span class="o">)</span>
        <span class="o">.</span><span class="na">withWriteConcern</span><span class="o">(</span><span class="n">WriteConcern</span><span class="o">.</span><span class="na">MAJORITY</span><span class="o">).</span><span class="na">insertOne</span><span class="o">(</span><span class="k">new</span> <span class="n">Document</span><span class="o">(</span><span class="s">&quot;xyz&quot;</span><span class="o">,</span> <span class="mi">0</span><span class="o">));</span>

<span class="cm">/* Step 1: Start a client session. */</span>

<span class="kd">final</span> <span class="n">ClientSession</span> <span class="n">clientSession</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">startSession</span><span class="o">();</span>

<span class="cm">/* Step 2: Optional. Define options to use for the transaction. */</span>

<span class="n">TransactionOptions</span> <span class="n">txnOptions</span> <span class="o">=</span> <span class="n">TransactionOptions</span><span class="o">.</span><span class="na">builder</span><span class="o">()</span>
        <span class="o">.</span><span class="na">readPreference</span><span class="o">(</span><span class="n">ReadPreference</span><span class="o">.</span><span class="na">primary</span><span class="o">())</span>
        <span class="o">.</span><span class="na">readConcern</span><span class="o">(</span><span class="n">ReadConcern</span><span class="o">.</span><span class="na">LOCAL</span><span class="o">)</span>
        <span class="o">.</span><span class="na">writeConcern</span><span class="o">(</span><span class="n">WriteConcern</span><span class="o">.</span><span class="na">MAJORITY</span><span class="o">)</span>
        <span class="o">.</span><span class="na">build</span><span class="o">();</span>

<span class="cm">/* Step 3: Define the sequence of operations to perform inside the transactions. */</span>

<span class="n">TransactionBody</span> <span class="n">txnBody</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TransactionBody</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;()</span> <span class="o">{</span>
    <span class="kd">public</span> <span class="n">String</span> <span class="nf">execute</span><span class="o">()</span> <span class="o">{</span>
        <span class="n">MongoCollection</span><span class="o">&lt;</span><span class="n">Document</span><span class="o">&gt;</span> <span class="n">coll1</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">getDatabase</span><span class="o">(</span><span class="s">&quot;mydb1&quot;</span><span class="o">).</span><span class="na">getCollection</span><span class="o">(</span><span class="s">&quot;foo&quot;</span><span class="o">);</span>
        <span class="n">MongoCollection</span><span class="o">&lt;</span><span class="n">Document</span><span class="o">&gt;</span> <span class="n">coll2</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="na">getDatabase</span><span class="o">(</span><span class="s">&quot;mydb2&quot;</span><span class="o">).</span><span class="na">getCollection</span><span class="o">(</span><span class="s">&quot;bar&quot;</span><span class="o">);</span>

        <span class="cm">/*</span>
<span class="cm">           Important:: You must pass the session to the operations.</span>
<span class="cm">         */</span>
        <span class="n">coll1</span><span class="o">.</span><span class="na">insertOne</span><span class="o">(</span><span class="n">clientSession</span><span class="o">,</span> <span class="k">new</span> <span class="n">Document</span><span class="o">(</span><span class="s">&quot;abc&quot;</span><span class="o">,</span> <span class="mi">1</span><span class="o">));</span>
        <span class="n">coll2</span><span class="o">.</span><span class="na">insertOne</span><span class="o">(</span><span class="n">clientSession</span><span class="o">,</span> <span class="k">new</span> <span class="n">Document</span><span class="o">(</span><span class="s">&quot;xyz&quot;</span><span class="o">,</span> <span class="mi">999</span><span class="o">));</span>
        <span class="k">return</span> <span class="s">&quot;Inserted into collections in different databases&quot;</span><span class="o">;</span>
    <span class="o">}</span>
<span class="o">};</span>
<span class="k">try</span> <span class="o">{</span>
    <span class="cm">/*</span>
<span class="cm">       Step 4: Use .withTransaction() to start a transaction,</span>
<span class="cm">       execute the callback, and commit (or abort on error).</span>
<span class="cm">    */</span>

    <span class="n">clientSession</span><span class="o">.</span><span class="na">withTransaction</span><span class="o">(</span><span class="n">txnBody</span><span class="o">,</span> <span class="n">txnOptions</span><span class="o">);</span>
<span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">RuntimeException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
    <span class="c1">// some error handling</span>
<span class="o">}</span> <span class="k">finally</span> <span class="o">{</span>
    <span class="n">clientSession</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
<span class="o">}</span>
</pre></div>
</div>
</div>
</div>
<div class="tabpanel-nodejs" data-tabid="nodejs"><p>The example uses the new callback API for working with
transactions, which starts a transaction, executes the
specified operations, and commits (or aborts on error). The
new callback API also incorporates retry logic for
<code class="docutils literal"><span class="pre">TransientTransactionError</span></code> or
<code class="docutils literal"><span class="pre">UnknownTransactionCommitResult</span></code> commit errors.</p>
<div class="admonition important">
<p class="first admonition-title">Important</p>
<ul class="last simple">
<li>For transactions on MongoDB 4.2 deployments (replica
sets and sharded clusters), clients <strong class="text-danger">must</strong> use
MongoDB drivers updated for MongoDB 4.2.</li>
<li>When using the drivers, each operation in the
transaction must be associated with the session (i.e.
pass in the session to each operation).</li>
</ul>
</div>
<div class="button-code-block">
<div class="button-row">
<a class="code-button--copy code-button" role="button">
copy</a>
</div>
<div class="copyable-code-block highlight-javascript"><div class="highlight"><pre><span></span>  <span class="c1">// For a replica set, include the replica set name and a seedlist of the members in the URI string; e.g.</span>
  <span class="c1">// const uri = &#39;mongodb://mongodb0.example.com:27017,mongodb1.example.com:27017/?replicaSet=myRepl&#39;</span>
  <span class="c1">// For a sharded cluster, connect to the mongos instances; e.g.</span>
  <span class="c1">// const uri = &#39;mongodb://mongos0.example.com:27017,mongos1.example.com:27017/&#39;</span>

  <span class="kr">const</span> <span class="nx">client</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MongoClient</span><span class="p">(</span><span class="nx">uri</span><span class="p">);</span>
  <span class="nx">await</span> <span class="nx">client</span><span class="p">.</span><span class="nx">connect</span><span class="p">();</span>

  <span class="c1">// Prereq: Create collections. CRUD operations in transactions must be on existing collections.</span>

  <span class="nx">await</span> <span class="nx">client</span>
    <span class="p">.</span><span class="nx">db</span><span class="p">(</span><span class="s1">&#39;mydb1&#39;</span><span class="p">)</span>
    <span class="p">.</span><span class="nx">collection</span><span class="p">(</span><span class="s1">&#39;foo&#39;</span><span class="p">)</span>
    <span class="p">.</span><span class="nx">insertOne</span><span class="p">({</span> <span class="nx">abc</span><span class="o">:</span> <span class="mi">0</span> <span class="p">},</span> <span class="p">{</span> <span class="nx">w</span><span class="o">:</span> <span class="s1">&#39;majority&#39;</span> <span class="p">});</span>

  <span class="nx">await</span> <span class="nx">client</span>
    <span class="p">.</span><span class="nx">db</span><span class="p">(</span><span class="s1">&#39;mydb2&#39;</span><span class="p">)</span>
    <span class="p">.</span><span class="nx">collection</span><span class="p">(</span><span class="s1">&#39;bar&#39;</span><span class="p">)</span>
    <span class="p">.</span><span class="nx">insertOne</span><span class="p">({</span> <span class="nx">xyz</span><span class="o">:</span> <span class="mi">0</span> <span class="p">},</span> <span class="p">{</span> <span class="nx">w</span><span class="o">:</span> <span class="s1">&#39;majority&#39;</span> <span class="p">});</span>

  <span class="c1">// Step 1: Start a Client Session</span>
  <span class="kr">const</span> <span class="nx">session</span> <span class="o">=</span> <span class="nx">client</span><span class="p">.</span><span class="nx">startSession</span><span class="p">();</span>

  <span class="c1">// Step 2: Optional. Define options to use for the transaction</span>
  <span class="kr">const</span> <span class="nx">transactionOptions</span> <span class="o">=</span> <span class="p">{</span>
    <span class="nx">readPreference</span><span class="o">:</span> <span class="s1">&#39;primary&#39;</span><span class="p">,</span>
    <span class="nx">readConcern</span><span class="o">:</span> <span class="p">{</span> <span class="nx">level</span><span class="o">:</span> <span class="s1">&#39;local&#39;</span> <span class="p">},</span>
    <span class="nx">writeConcern</span><span class="o">:</span> <span class="p">{</span> <span class="nx">w</span><span class="o">:</span> <span class="s1">&#39;majority&#39;</span> <span class="p">}</span>
  <span class="p">};</span>

  <span class="c1">// Step 3: Use withTransaction to start a transaction, execute the callback, and commit (or abort on error)</span>
  <span class="c1">// Note: The callback for withTransaction MUST be async and/or return a Promise.</span>
  <span class="k">try</span> <span class="p">{</span>
    <span class="nx">await</span> <span class="nx">session</span><span class="p">.</span><span class="nx">withTransaction</span><span class="p">(</span><span class="nx">async</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="p">{</span>
      <span class="kr">const</span> <span class="nx">coll1</span> <span class="o">=</span> <span class="nx">client</span><span class="p">.</span><span class="nx">db</span><span class="p">(</span><span class="s1">&#39;mydb1&#39;</span><span class="p">).</span><span class="nx">collection</span><span class="p">(</span><span class="s1">&#39;foo&#39;</span><span class="p">);</span>
      <span class="kr">const</span> <span class="nx">coll2</span> <span class="o">=</span> <span class="nx">client</span><span class="p">.</span><span class="nx">db</span><span class="p">(</span><span class="s1">&#39;mydb2&#39;</span><span class="p">).</span><span class="nx">collection</span><span class="p">(</span><span class="s1">&#39;bar&#39;</span><span class="p">);</span>

      <span class="c1">// Important:: You must pass the session to the operations</span>

      <span class="nx">await</span> <span class="nx">coll1</span><span class="p">.</span><span class="nx">insertOne</span><span class="p">({</span> <span class="nx">abc</span><span class="o">:</span> <span class="mi">1</span> <span class="p">},</span> <span class="p">{</span> <span class="nx">session</span> <span class="p">});</span>
      <span class="nx">await</span> <span class="nx">coll2</span><span class="p">.</span><span class="nx">insertOne</span><span class="p">({</span> <span class="nx">xyz</span><span class="o">:</span> <span class="mi">999</span> <span class="p">},</span> <span class="p">{</span> <span class="nx">session</span> <span class="p">});</span>
    <span class="p">},</span> <span class="nx">transactionOptions</span><span class="p">);</span>
  <span class="p">}</span> <span class="k">finally</span> <span class="p">{</span>
    <span class="nx">await</span> <span class="nx">session</span><span class="p">.</span><span class="nx">endSession</span><span class="p">();</span>
    <span class="nx">await</span> <span class="nx">client</span><span class="p">.</span><span class="nx">close</span><span class="p">();</span>
  <span class="p">}</span>
</pre></div>
</div>
</div>
</div>
<div class="tabpanel-php" data-tabid="php"><p>The example uses the new callback API for working with
transactions, which starts a transaction, executes the
specified operations, and commits (or aborts on error). The
new callback API also incorporates retry logic for
<code class="docutils literal"><span class="pre">TransientTransactionError</span></code> or
<code class="docutils literal"><span class="pre">UnknownTransactionCommitResult</span></code> commit errors.</p>
<div class="admonition important">
<p class="first admonition-title">Important</p>
<ul class="last simple">
<li>For transactions on MongoDB 4.2 deployments (replica
sets and sharded clusters), clients <strong class="text-danger">must</strong> use
MongoDB drivers updated for MongoDB 4.2.</li>
<li>When using the drivers, each operation in the
transaction must be associated with the session (i.e.
pass in the session to each operation).</li>
</ul>
</div>
<div class="button-code-block">
<div class="button-row">
<a class="code-button--copy code-button" role="button">
copy</a>
</div>
<div class="copyable-code-block highlight-php"><div class="highlight"><pre><span></span><span class="cm">/*</span>
<span class="cm"> * For a replica set, include the replica set name and a seedlist of the members in the URI string; e.g.</span>
<span class="cm"> * uriString = &#39;mongodb://mongodb0.example.com:27017,mongodb1.example.com:27017/?replicaSet=myRepl&#39;</span>
<span class="cm"> * For a sharded cluster, connect to the mongos instances; e.g.</span>
<span class="cm"> * uriString = &#39;mongodb://mongos0.example.com:27017,mongos1.example.com:27017/&#39;</span>
<span class="cm"> */</span>

<span class="nv">$client</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">\MongoDB\Client</span><span class="p">(</span><span class="nv">$uriString</span><span class="p">);</span>

<span class="c1">// Prerequisite: Create collections.</span>
<span class="nv">$client</span><span class="o">-&gt;</span><span class="na">selectCollection</span><span class="p">(</span>
    <span class="s1">&#39;mydb1&#39;</span><span class="p">,</span>
    <span class="s1">&#39;foo&#39;</span><span class="p">,</span>
    <span class="p">[</span>
        <span class="s1">&#39;writeConcern&#39;</span> <span class="o">=&gt;</span> <span class="k">new</span> <span class="nx">\MongoDB\Driver\WriteConcern</span><span class="p">(</span><span class="nx">\MongoDB\Driver\WriteConcern</span><span class="o">::</span><span class="na">MAJORITY</span><span class="p">,</span> <span class="mi">1000</span><span class="p">),</span>
    <span class="p">]</span>
<span class="p">)</span><span class="o">-&gt;</span><span class="na">insertOne</span><span class="p">([</span><span class="s1">&#39;abc&#39;</span> <span class="o">=&gt;</span> <span class="mi">0</span><span class="p">]);</span>

<span class="nv">$client</span><span class="o">-&gt;</span><span class="na">selectCollection</span><span class="p">(</span>
    <span class="s1">&#39;mydb2&#39;</span><span class="p">,</span>
    <span class="s1">&#39;bar&#39;</span><span class="p">,</span>
    <span class="p">[</span>
        <span class="s1">&#39;writeConcern&#39;</span> <span class="o">=&gt;</span> <span class="k">new</span> <span class="nx">\MongoDB\Driver\WriteConcern</span><span class="p">(</span><span class="nx">\MongoDB\Driver\WriteConcern</span><span class="o">::</span><span class="na">MAJORITY</span><span class="p">,</span> <span class="mi">1000</span><span class="p">),</span>
    <span class="p">]</span>
<span class="p">)</span><span class="o">-&gt;</span><span class="na">insertOne</span><span class="p">([</span><span class="s1">&#39;xyz&#39;</span> <span class="o">=&gt;</span> <span class="mi">0</span><span class="p">]);</span>

<span class="c1">// Step 1: Define the callback that specifies the sequence of operations to perform inside the transactions.</span>

<span class="nv">$callback</span> <span class="o">=</span> <span class="k">function</span> <span class="p">(</span><span class="nx">\MongoDB\Driver\Session</span> <span class="nv">$session</span><span class="p">)</span> <span class="k">use</span> <span class="p">(</span><span class="nv">$client</span><span class="p">)</span> <span class="p">{</span>
    <span class="nv">$client</span>
        <span class="o">-&gt;</span><span class="na">selectCollection</span><span class="p">(</span><span class="s1">&#39;mydb1&#39;</span><span class="p">,</span> <span class="s1">&#39;foo&#39;</span><span class="p">)</span>
        <span class="o">-&gt;</span><span class="na">insertOne</span><span class="p">([</span><span class="s1">&#39;abc&#39;</span> <span class="o">=&gt;</span> <span class="mi">1</span><span class="p">],</span> <span class="p">[</span><span class="s1">&#39;session&#39;</span> <span class="o">=&gt;</span> <span class="nv">$session</span><span class="p">]);</span>

    <span class="nv">$client</span>
        <span class="o">-&gt;</span><span class="na">selectCollection</span><span class="p">(</span><span class="s1">&#39;mydb2&#39;</span><span class="p">,</span> <span class="s1">&#39;bar&#39;</span><span class="p">)</span>
        <span class="o">-&gt;</span><span class="na">insertOne</span><span class="p">([</span><span class="s1">&#39;xyz&#39;</span> <span class="o">=&gt;</span> <span class="mi">999</span><span class="p">],</span> <span class="p">[</span><span class="s1">&#39;session&#39;</span> <span class="o">=&gt;</span> <span class="nv">$session</span><span class="p">]);</span>
<span class="p">};</span>

<span class="c1">// Step 2: Start a client session.</span>

<span class="nv">$session</span> <span class="o">=</span> <span class="nv">$client</span><span class="o">-&gt;</span><span class="na">startSession</span><span class="p">();</span>

<span class="c1">// Step 3: Use with_transaction to start a transaction, execute the callback, and commit (or abort on error).</span>

<span class="nv">$transactionOptions</span> <span class="o">=</span> <span class="p">[</span>
    <span class="s1">&#39;readConcern&#39;</span> <span class="o">=&gt;</span> <span class="k">new</span> <span class="nx">\MongoDB\Driver\ReadConcern</span><span class="p">(</span><span class="nx">\MongoDB\Driver\ReadConcern</span><span class="o">::</span><span class="na">LOCAL</span><span class="p">),</span>
    <span class="s1">&#39;writeConcern&#39;</span> <span class="o">=&gt;</span> <span class="k">new</span> <span class="nx">\MongoDB\Driver\WriteConcern</span><span class="p">(</span><span class="nx">\MongoDB\Driver\WriteConcern</span><span class="o">::</span><span class="na">MAJORITY</span><span class="p">,</span> <span class="mi">1000</span><span class="p">),</span>
    <span class="s1">&#39;readPreference&#39;</span> <span class="o">=&gt;</span> <span class="k">new</span> <span class="nx">\MongoDB\Driver\ReadPreference</span><span class="p">(</span><span class="nx">\MongoDB\Driver\ReadPreference</span><span class="o">::</span><span class="na">RP_PRIMARY</span><span class="p">),</span>
<span class="p">];</span>

<span class="nx">\MongoDB\with_transaction</span><span class="p">(</span><span class="nv">$session</span><span class="p">,</span> <span class="nv">$callback</span><span class="p">,</span> <span class="nv">$transactionOptions</span><span class="p">);</span>
</pre></div>
</div>
</div>
</div>
<div class="tabpanel-motor" data-tabid="motor"><p>The example uses the new callback API for working with
transactions, which starts a transaction, executes the
specified operations, and commits (or aborts on error). The
new callback API incorporates retry logic for
<a class="reference internal" href="transactions-in-applications.html#transient-transaction-error"><span class="std std-ref">&quot;TransientTransactionError&quot;</span></a> or
<a class="reference internal" href="transactions-in-applications.html#unknown-transaction-commit-result"><span class="std std-ref">&quot;UnknownTransactionCommitResult&quot;</span></a> commit errors.</p>
<div class="admonition important">
<p class="first admonition-title">Important</p>
<ul class="last simple">
<li>For transactions on MongoDB 4.2 deployments (replica
sets and sharded clusters), clients <strong class="text-danger">must</strong> use
MongoDB drivers updated for MongoDB 4.2.</li>
<li>When using the drivers, each operation in the
transaction must be associated with the session (i.e.
pass in the session to each operation).</li>
</ul>
</div>
<div class="copyable-code button-code-block">
<div class="button-row">
<a class="code-button--copy code-button" role="button">
copy</a>
</div>
<div class="copyable-code-block highlight-python"><div class="highlight"><pre><span></span>
<span class="c1"># For a replica set, include the replica set name and a seedlist of the members in the URI string; e.g.</span>
<span class="c1"># uriString = &#39;mongodb://mongodb0.example.com:27017,mongodb1.example.com:27017/?replicaSet=myRepl&#39;</span>
<span class="c1"># For a sharded cluster, connect to the mongos instances; e.g.</span>
<span class="c1"># uriString = &#39;mongodb://mongos0.example.com:27017,mongos1.example.com:27017/&#39;</span>

<span class="n">client</span> <span class="o">=</span> <span class="n">AsyncIOMotorClient</span><span class="p">(</span><span class="n">uriString</span><span class="p">)</span>
<span class="n">wc_majority</span> <span class="o">=</span> <span class="n">WriteConcern</span><span class="p">(</span><span class="s2">&quot;majority&quot;</span><span class="p">,</span> <span class="n">wtimeout</span><span class="o">=</span><span class="mi">1000</span><span class="p">)</span>

<span class="c1"># Prereq: Create collections. CRUD operations in transactions must be on existing collections.</span>
<span class="n">await</span> <span class="n">client</span><span class="o">.</span><span class="n">get_database</span><span class="p">(</span>
    <span class="s2">&quot;mydb1&quot;</span><span class="p">,</span> <span class="n">write_concern</span><span class="o">=</span><span class="n">wc_majority</span><span class="p">)</span><span class="o">.</span><span class="n">foo</span><span class="o">.</span><span class="n">insert_one</span><span class="p">({</span><span class="s1">&#39;abc&#39;</span><span class="p">:</span> <span class="mi">0</span><span class="p">})</span>
<span class="n">await</span> <span class="n">client</span><span class="o">.</span><span class="n">get_database</span><span class="p">(</span>
    <span class="s2">&quot;mydb2&quot;</span><span class="p">,</span> <span class="n">write_concern</span><span class="o">=</span><span class="n">wc_majority</span><span class="p">)</span><span class="o">.</span><span class="n">bar</span><span class="o">.</span><span class="n">insert_one</span><span class="p">({</span><span class="s1">&#39;xyz&#39;</span><span class="p">:</span> <span class="mi">0</span><span class="p">})</span>

<span class="c1"># Step 1: Define the callback that specifies the sequence of operations to perform inside the transactions.</span>
<span class="n">async</span> <span class="k">def</span> <span class="nf">callback</span><span class="p">(</span><span class="n">my_session</span><span class="p">):</span>
    <span class="n">collection_one</span> <span class="o">=</span> <span class="n">my_session</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">mydb1</span><span class="o">.</span><span class="n">foo</span>
    <span class="n">collection_two</span> <span class="o">=</span> <span class="n">my_session</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">mydb2</span><span class="o">.</span><span class="n">bar</span>

    <span class="c1"># Important:: You must pass the session to the operations.</span>
    <span class="n">await</span> <span class="n">collection_one</span><span class="o">.</span><span class="n">insert_one</span><span class="p">({</span><span class="s1">&#39;abc&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">},</span> <span class="n">session</span><span class="o">=</span><span class="n">my_session</span><span class="p">)</span>
    <span class="n">await</span> <span class="n">collection_two</span><span class="o">.</span><span class="n">insert_one</span><span class="p">({</span><span class="s1">&#39;xyz&#39;</span><span class="p">:</span> <span class="mi">999</span><span class="p">},</span> <span class="n">session</span><span class="o">=</span><span class="n">my_session</span><span class="p">)</span>

<span class="c1"># Step 2: Start a client session.</span>
<span class="n">async</span> <span class="k">with</span> <span class="n">await</span> <span class="n">client</span><span class="o">.</span><span class="n">start_session</span><span class="p">()</span> <span class="k">as</span> <span class="n">session</span><span class="p">:</span>
    <span class="c1"># Step 3: Use with_transaction to start a transaction, execute the callback, and commit (or abort on error).</span>
    <span class="n">await</span> <span class="n">session</span><span class="o">.</span><span class="n">with_transaction</span><span class="p">(</span>
        <span class="n">callback</span><span class="p">,</span> <span class="n">read_concern</span><span class="o">=</span><span class="n">ReadConcern</span><span class="p">(</span><span class="s1">&#39;local&#39;</span><span class="p">),</span>
        <span class="n">write_concern</span><span class="o">=</span><span class="n">wc_majority</span><span class="p">,</span>
        <span class="n">read_preference</span><span class="o">=</span><span class="n">ReadPreference</span><span class="o">.</span><span class="n">PRIMARY</span><span class="p">)</span>

</pre></div>
</div>
</div>
</div>
<div class="tabpanel-c" data-tabid="c"><p>The example uses the new callback API for working with
transactions, which starts a transaction, executes the
specified operations, and commits (or aborts on error). The
new callback API also incorporates retry logic for
<code class="docutils literal"><span class="pre">TransientTransactionError</span></code> or
<code class="docutils literal"><span class="pre">UnknownTransactionCommitResult</span></code> commit errors.</p>
<div class="admonition important">
<p class="first admonition-title">Important</p>
<ul class="last simple">
<li>For transactions on MongoDB 4.2 deployments (replica
sets and sharded clusters), clients <strong class="text-danger">must</strong> use
MongoDB drivers updated for MongoDB 4.2.</li>
<li>When using the drivers, each operation in the
transaction must be associated with the session (i.e.
pass in the session to each operation).</li>
</ul>
</div>
<div class="button-code-block">
<div class="button-row">
<a class="code-button--copy code-button" role="button">
copy</a>
</div>
<div class="copyable-code-block highlight-c"><div class="highlight"><pre><span></span><span class="k">static</span> <span class="kt">bool</span>
<span class="nf">with_transaction_example</span> <span class="p">(</span><span class="n">bson_error_t</span> <span class="o">*</span><span class="n">error</span><span class="p">)</span>
<span class="p">{</span>
   <span class="n">mongoc_client_t</span> <span class="o">*</span><span class="n">client</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
   <span class="n">mongoc_write_concern_t</span> <span class="o">*</span><span class="n">wc</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
   <span class="n">mongoc_read_concern_t</span> <span class="o">*</span><span class="n">rc</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
   <span class="n">mongoc_read_prefs_t</span> <span class="o">*</span><span class="n">rp</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
   <span class="n">mongoc_collection_t</span> <span class="o">*</span><span class="n">coll</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
   <span class="kt">bool</span> <span class="n">success</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>
   <span class="kt">bool</span> <span class="n">ret</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>
   <span class="n">bson_t</span> <span class="o">*</span><span class="n">doc</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
   <span class="n">bson_t</span> <span class="o">*</span><span class="n">insert_opts</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
   <span class="n">mongoc_client_session_t</span> <span class="o">*</span><span class="n">session</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
   <span class="n">mongoc_transaction_opt_t</span> <span class="o">*</span><span class="n">txn_opts</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>

   <span class="cm">/* For a replica set, include the replica set name and a seedlist of the</span>
<span class="cm">    * members in the URI string; e.g.</span>
<span class="cm">    * uri_repl = &quot;mongodb://mongodb0.example.com:27017,mongodb1.example.com:&quot; \</span>
<span class="cm">    *    &quot;27017/?replicaSet=myRepl&quot;;</span>
<span class="cm">    * client = mongoc_client_new (uri_repl);</span>
<span class="cm">    * For a sharded cluster, connect to the mongos instances; e.g.</span>
<span class="cm">    * uri_sharded =</span>
<span class="cm">    * &quot;mongodb://mongos0.example.com:27017,mongos1.example.com:27017/&quot;;</span>
<span class="cm">    * client = mongoc_client_new (uri_sharded);</span>
<span class="cm">    */</span>

   <span class="n">client</span> <span class="o">=</span> <span class="n">get_client</span> <span class="p">();</span>

   <span class="cm">/* Prereq: Create collections. */</span>
   <span class="n">wc</span> <span class="o">=</span> <span class="n">mongoc_write_concern_new</span> <span class="p">();</span>
   <span class="n">mongoc_write_concern_set_wmajority</span> <span class="p">(</span><span class="n">wc</span><span class="p">,</span> <span class="mi">1000</span><span class="p">);</span>
   <span class="n">insert_opts</span> <span class="o">=</span> <span class="n">bson_new</span> <span class="p">();</span>
   <span class="n">mongoc_write_concern_append</span> <span class="p">(</span><span class="n">wc</span><span class="p">,</span> <span class="n">insert_opts</span><span class="p">);</span>
   <span class="n">coll</span> <span class="o">=</span> <span class="n">mongoc_client_get_collection</span> <span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="s">&quot;mydb1&quot;</span><span class="p">,</span> <span class="s">&quot;foo&quot;</span><span class="p">);</span>
   <span class="n">doc</span> <span class="o">=</span> <span class="n">BCON_NEW</span> <span class="p">(</span><span class="s">&quot;abc&quot;</span><span class="p">,</span> <span class="n">BCON_INT32</span> <span class="p">(</span><span class="mi">0</span><span class="p">));</span>
   <span class="n">ret</span> <span class="o">=</span> <span class="n">mongoc_collection_insert_one</span> <span class="p">(</span>
      <span class="n">coll</span><span class="p">,</span> <span class="n">doc</span><span class="p">,</span> <span class="n">insert_opts</span><span class="p">,</span> <span class="nb">NULL</span> <span class="cm">/* reply */</span><span class="p">,</span> <span class="n">error</span><span class="p">);</span>
   <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">ret</span><span class="p">)</span> <span class="p">{</span>
      <span class="k">goto</span> <span class="n">fail</span><span class="p">;</span>
   <span class="p">}</span>
   <span class="n">bson_destroy</span> <span class="p">(</span><span class="n">doc</span><span class="p">);</span>
   <span class="n">mongoc_collection_destroy</span> <span class="p">(</span><span class="n">coll</span><span class="p">);</span>
   <span class="n">coll</span> <span class="o">=</span> <span class="n">mongoc_client_get_collection</span> <span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="s">&quot;mydb2&quot;</span><span class="p">,</span> <span class="s">&quot;bar&quot;</span><span class="p">);</span>
   <span class="n">doc</span> <span class="o">=</span> <span class="n">BCON_NEW</span> <span class="p">(</span><span class="s">&quot;xyz&quot;</span><span class="p">,</span> <span class="n">BCON_INT32</span> <span class="p">(</span><span class="mi">0</span><span class="p">));</span>
   <span class="n">ret</span> <span class="o">=</span> <span class="n">mongoc_collection_insert_one</span> <span class="p">(</span>
      <span class="n">coll</span><span class="p">,</span> <span class="n">doc</span><span class="p">,</span> <span class="n">insert_opts</span><span class="p">,</span> <span class="nb">NULL</span> <span class="cm">/* reply */</span><span class="p">,</span> <span class="n">error</span><span class="p">);</span>
   <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">ret</span><span class="p">)</span> <span class="p">{</span>
      <span class="k">goto</span> <span class="n">fail</span><span class="p">;</span>
   <span class="p">}</span>

   <span class="cm">/* Step 1: Start a client session. */</span>
   <span class="n">session</span> <span class="o">=</span> <span class="n">mongoc_client_start_session</span> <span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="nb">NULL</span> <span class="cm">/* opts */</span><span class="p">,</span> <span class="n">error</span><span class="p">);</span>
   <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">session</span><span class="p">)</span> <span class="p">{</span>
      <span class="k">goto</span> <span class="n">fail</span><span class="p">;</span>
   <span class="p">}</span>

   <span class="cm">/* Step 2: Optional. Define options to use for the transaction. */</span>
   <span class="n">txn_opts</span> <span class="o">=</span> <span class="n">mongoc_transaction_opts_new</span> <span class="p">();</span>
   <span class="n">rp</span> <span class="o">=</span> <span class="n">mongoc_read_prefs_new</span> <span class="p">(</span><span class="n">MONGOC_READ_PRIMARY</span><span class="p">);</span>
   <span class="n">rc</span> <span class="o">=</span> <span class="n">mongoc_read_concern_new</span> <span class="p">();</span>
   <span class="n">mongoc_read_concern_set_level</span> <span class="p">(</span><span class="n">rc</span><span class="p">,</span> <span class="n">MONGOC_READ_CONCERN_LEVEL_LOCAL</span><span class="p">);</span>
   <span class="n">mongoc_transaction_opts_set_read_prefs</span> <span class="p">(</span><span class="n">txn_opts</span><span class="p">,</span> <span class="n">rp</span><span class="p">);</span>
   <span class="n">mongoc_transaction_opts_set_read_concern</span> <span class="p">(</span><span class="n">txn_opts</span><span class="p">,</span> <span class="n">rc</span><span class="p">);</span>
   <span class="n">mongoc_transaction_opts_set_write_concern</span> <span class="p">(</span><span class="n">txn_opts</span><span class="p">,</span> <span class="n">wc</span><span class="p">);</span>

   <span class="cm">/* Step 3: Use mongoc_client_session_with_transaction to start a transaction,</span>
<span class="cm">    * execute the callback, and commit (or abort on error). */</span>
   <span class="n">ret</span> <span class="o">=</span> <span class="n">mongoc_client_session_with_transaction</span> <span class="p">(</span>
      <span class="n">session</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">txn_opts</span><span class="p">,</span> <span class="nb">NULL</span> <span class="cm">/* ctx */</span><span class="p">,</span> <span class="nb">NULL</span> <span class="cm">/* reply */</span><span class="p">,</span> <span class="n">error</span><span class="p">);</span>
   <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">ret</span><span class="p">)</span> <span class="p">{</span>
      <span class="k">goto</span> <span class="n">fail</span><span class="p">;</span>
   <span class="p">}</span>

   <span class="n">success</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
<span class="nl">fail</span><span class="p">:</span>
   <span class="n">bson_destroy</span> <span class="p">(</span><span class="n">doc</span><span class="p">);</span>
   <span class="n">mongoc_collection_destroy</span> <span class="p">(</span><span class="n">coll</span><span class="p">);</span>
   <span class="n">bson_destroy</span> <span class="p">(</span><span class="n">insert_opts</span><span class="p">);</span>
   <span class="n">mongoc_read_concern_destroy</span> <span class="p">(</span><span class="n">rc</span><span class="p">);</span>
   <span class="n">mongoc_read_prefs_destroy</span> <span class="p">(</span><span class="n">rp</span><span class="p">);</span>
   <span class="n">mongoc_write_concern_destroy</span> <span class="p">(</span><span class="n">wc</span><span class="p">);</span>
   <span class="n">mongoc_transaction_opts_destroy</span> <span class="p">(</span><span class="n">txn_opts</span><span class="p">);</span>
   <span class="n">mongoc_client_session_destroy</span> <span class="p">(</span><span class="n">session</span><span class="p">);</span>
   <span class="n">mongoc_client_destroy</span> <span class="p">(</span><span class="n">client</span><span class="p">);</span>
   <span class="k">return</span> <span class="n">success</span><span class="p">;</span>
<span class="p">}</span>

<span class="cm">/* Define the callback that specifies the sequence of operations to perform</span>
<span class="cm"> * inside the transactions. */</span>
<span class="k">static</span> <span class="kt">bool</span>
<span class="nf">callback</span> <span class="p">(</span><span class="n">mongoc_client_session_t</span> <span class="o">*</span><span class="n">session</span><span class="p">,</span>
          <span class="kt">void</span> <span class="o">*</span><span class="n">ctx</span><span class="p">,</span>
          <span class="n">bson_t</span> <span class="o">**</span><span class="n">reply</span><span class="p">,</span>
          <span class="n">bson_error_t</span> <span class="o">*</span><span class="n">error</span><span class="p">)</span>
<span class="p">{</span>
   <span class="n">mongoc_client_t</span> <span class="o">*</span><span class="n">client</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
   <span class="n">mongoc_collection_t</span> <span class="o">*</span><span class="n">coll</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
   <span class="n">bson_t</span> <span class="o">*</span><span class="n">doc</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
   <span class="kt">bool</span> <span class="n">success</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>
   <span class="kt">bool</span> <span class="n">ret</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>

   <span class="n">client</span> <span class="o">=</span> <span class="n">mongoc_client_session_get_client</span> <span class="p">(</span><span class="n">session</span><span class="p">);</span>
   <span class="n">coll</span> <span class="o">=</span> <span class="n">mongoc_client_get_collection</span> <span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="s">&quot;mydb1&quot;</span><span class="p">,</span> <span class="s">&quot;foo&quot;</span><span class="p">);</span>
   <span class="n">doc</span> <span class="o">=</span> <span class="n">BCON_NEW</span> <span class="p">(</span><span class="s">&quot;abc&quot;</span><span class="p">,</span> <span class="n">BCON_INT32</span> <span class="p">(</span><span class="mi">1</span><span class="p">));</span>
   <span class="n">ret</span> <span class="o">=</span>
      <span class="n">mongoc_collection_insert_one</span> <span class="p">(</span><span class="n">coll</span><span class="p">,</span> <span class="n">doc</span><span class="p">,</span> <span class="nb">NULL</span> <span class="cm">/* opts */</span><span class="p">,</span> <span class="o">*</span><span class="n">reply</span><span class="p">,</span> <span class="n">error</span><span class="p">);</span>
   <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">ret</span><span class="p">)</span> <span class="p">{</span>
      <span class="k">goto</span> <span class="n">fail</span><span class="p">;</span>
   <span class="p">}</span>
   <span class="n">bson_destroy</span> <span class="p">(</span><span class="n">doc</span><span class="p">);</span>
   <span class="n">mongoc_collection_destroy</span> <span class="p">(</span><span class="n">coll</span><span class="p">);</span>
   <span class="n">coll</span> <span class="o">=</span> <span class="n">mongoc_client_get_collection</span> <span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="s">&quot;mydb2&quot;</span><span class="p">,</span> <span class="s">&quot;bar&quot;</span><span class="p">);</span>
   <span class="n">doc</span> <span class="o">=</span> <span class="n">BCON_NEW</span> <span class="p">(</span><span class="s">&quot;xyz&quot;</span><span class="p">,</span> <span class="n">BCON_INT32</span> <span class="p">(</span><span class="mi">999</span><span class="p">));</span>
   <span class="n">ret</span> <span class="o">=</span>
      <span class="n">mongoc_collection_insert_one</span> <span class="p">(</span><span class="n">coll</span><span class="p">,</span> <span class="n">doc</span><span class="p">,</span> <span class="nb">NULL</span> <span class="cm">/* opts */</span><span class="p">,</span> <span class="o">*</span><span class="n">reply</span><span class="p">,</span> <span class="n">error</span><span class="p">);</span>
   <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">ret</span><span class="p">)</span> <span class="p">{</span>
      <span class="k">goto</span> <span class="n">fail</span><span class="p">;</span>
   <span class="p">}</span>

   <span class="n">success</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
<span class="nl">fail</span><span class="p">:</span>
   <span class="n">mongoc_collection_destroy</span> <span class="p">(</span><span class="n">coll</span><span class="p">);</span>
   <span class="n">bson_destroy</span> <span class="p">(</span><span class="n">doc</span><span class="p">);</span>
   <span class="k">return</span> <span class="n">success</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</div>
<div class="tabpanel-cpp" data-tabid="cpp"><p>The example uses the new callback API for working with
transactions, which starts a transaction, executes the
specified operations, and commits (or aborts on error). The
new callback API also incorporates retry logic for
<code class="docutils literal"><span class="pre">TransientTransactionError</span></code> or
<code class="docutils literal"><span class="pre">UnknownTransactionCommitResult</span></code> commit errors.</p>
<div class="admonition important">
<p class="first admonition-title">Important</p>
<ul class="last simple">
<li>For transactions on MongoDB 4.2 deployments (replica
sets and sharded clusters), clients <strong class="text-danger">must</strong> use
MongoDB drivers updated for MongoDB 4.2.</li>
<li>When using the drivers, each operation in the
transaction must be associated with the session (i.e.
pass in the session to each operation).</li>
</ul>
</div>
<div class="button-code-block">
<div class="button-row">
<a class="code-button--copy code-button" role="button">
copy</a>
</div>
<div class="copyable-code-block highlight-cpp"><div class="highlight"><pre><span></span><span class="c1">// The mongocxx::instance constructor and destructor initialize and shut down the driver,</span>
<span class="c1">// respectively. Therefore, a mongocxx::instance must be created before using the driver and</span>
<span class="c1">// must remain alive for as long as the driver is in use.</span>
<span class="n">mongocxx</span><span class="o">::</span><span class="n">instance</span> <span class="n">inst</span><span class="p">{};</span>

<span class="c1">// For a replica set, include the replica set name and a seedlist of the members in the URI</span>
<span class="c1">// string; e.g.</span>
<span class="c1">// uriString =</span>
<span class="c1">// &#39;mongodb://mongodb0.example.com:27017,mongodb1.example.com:27017/?replicaSet=myRepl&#39;</span>
<span class="c1">// For a sharded cluster, connect to the mongos instances; e.g.</span>
<span class="c1">// uriString = &#39;mongodb://mongos0.example.com:27017,mongos1.example.com:27017/&#39;</span>
<span class="n">mongocxx</span><span class="o">::</span><span class="n">client</span> <span class="n">client</span><span class="p">{</span><span class="n">mongocxx</span><span class="o">::</span><span class="n">uri</span><span class="p">{</span><span class="s">&quot;mongodb://localhost/?replicaSet=replset&quot;</span><span class="p">}};</span>

<span class="n">write_concern</span> <span class="n">wc_majority</span><span class="p">{};</span>
<span class="n">wc_majority</span><span class="p">.</span><span class="n">acknowledge_level</span><span class="p">(</span><span class="n">write_concern</span><span class="o">::</span><span class="n">level</span><span class="o">::</span><span class="n">k_majority</span><span class="p">);</span>

<span class="n">read_concern</span> <span class="n">rc_local</span><span class="p">{};</span>
<span class="n">rc_local</span><span class="p">.</span><span class="n">acknowledge_level</span><span class="p">(</span><span class="n">read_concern</span><span class="o">::</span><span class="n">level</span><span class="o">::</span><span class="n">k_local</span><span class="p">);</span>

<span class="n">read_preference</span> <span class="n">rp_primary</span><span class="p">{};</span>
<span class="n">rp_primary</span><span class="p">.</span><span class="n">mode</span><span class="p">(</span><span class="n">read_preference</span><span class="o">::</span><span class="n">read_mode</span><span class="o">::</span><span class="n">k_primary</span><span class="p">);</span>

<span class="c1">// Prereq: Create collections.</span>

<span class="k">auto</span> <span class="n">foo</span> <span class="o">=</span> <span class="n">client</span><span class="p">[</span><span class="s">&quot;mydb1&quot;</span><span class="p">][</span><span class="s">&quot;foo&quot;</span><span class="p">];</span>
<span class="k">auto</span> <span class="n">bar</span> <span class="o">=</span> <span class="n">client</span><span class="p">[</span><span class="s">&quot;mydb2&quot;</span><span class="p">][</span><span class="s">&quot;bar&quot;</span><span class="p">];</span>

<span class="k">try</span> <span class="p">{</span>
    <span class="n">options</span><span class="o">::</span><span class="n">insert</span> <span class="n">opts</span><span class="p">;</span>
    <span class="n">opts</span><span class="p">.</span><span class="n">write_concern</span><span class="p">(</span><span class="n">wc_majority</span><span class="p">);</span>

    <span class="n">foo</span><span class="p">.</span><span class="n">insert_one</span><span class="p">(</span><span class="n">make_document</span><span class="p">(</span><span class="n">kvp</span><span class="p">(</span><span class="s">&quot;abc&quot;</span><span class="p">,</span> <span class="mi">0</span><span class="p">)),</span> <span class="n">opts</span><span class="p">);</span>
    <span class="n">bar</span><span class="p">.</span><span class="n">insert_one</span><span class="p">(</span><span class="n">make_document</span><span class="p">(</span><span class="n">kvp</span><span class="p">(</span><span class="s">&quot;xyz&quot;</span><span class="p">,</span> <span class="mi">0</span><span class="p">)),</span> <span class="n">opts</span><span class="p">);</span>
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="k">const</span> <span class="n">mongocxx</span><span class="o">::</span><span class="n">exception</span><span class="o">&amp;</span> <span class="n">e</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;An exception occurred while inserting: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">e</span><span class="p">.</span><span class="n">what</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
    <span class="k">return</span> <span class="n">EXIT_FAILURE</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1">// Step 1: Define the callback that specifies the sequence of operations to perform inside the</span>
<span class="c1">// transactions.</span>
<span class="n">client_session</span><span class="o">::</span><span class="n">with_transaction_cb</span> <span class="n">callback</span> <span class="o">=</span> <span class="p">[</span><span class="o">&amp;</span><span class="p">](</span><span class="n">client_session</span><span class="o">*</span> <span class="n">session</span><span class="p">)</span> <span class="p">{</span>
    <span class="c1">// Important::  You must pass the session to the operations.</span>
    <span class="n">foo</span><span class="p">.</span><span class="n">insert_one</span><span class="p">(</span><span class="o">*</span><span class="n">session</span><span class="p">,</span> <span class="n">make_document</span><span class="p">(</span><span class="n">kvp</span><span class="p">(</span><span class="s">&quot;abc&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)));</span>
    <span class="n">bar</span><span class="p">.</span><span class="n">insert_one</span><span class="p">(</span><span class="o">*</span><span class="n">session</span><span class="p">,</span> <span class="n">make_document</span><span class="p">(</span><span class="n">kvp</span><span class="p">(</span><span class="s">&quot;xyz&quot;</span><span class="p">,</span> <span class="mi">999</span><span class="p">)));</span>
<span class="p">};</span>

<span class="c1">// Step 2: Start a client session</span>
<span class="k">auto</span> <span class="n">session</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="n">start_session</span><span class="p">();</span>

<span class="c1">// Step 3: Use with_transaction to start a transaction, execute the callback,</span>
<span class="c1">// and commit (or abort on error).</span>
<span class="k">try</span> <span class="p">{</span>
    <span class="n">options</span><span class="o">::</span><span class="n">transaction</span> <span class="n">opts</span><span class="p">;</span>
    <span class="n">opts</span><span class="p">.</span><span class="n">write_concern</span><span class="p">(</span><span class="n">wc_majority</span><span class="p">);</span>
    <span class="n">opts</span><span class="p">.</span><span class="n">read_concern</span><span class="p">(</span><span class="n">rc_local</span><span class="p">);</span>
    <span class="n">opts</span><span class="p">.</span><span class="n">read_preference</span><span class="p">(</span><span class="n">rp_primary</span><span class="p">);</span>

    <span class="n">session</span><span class="p">.</span><span class="n">with_transaction</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="n">opts</span><span class="p">);</span>
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="k">const</span> <span class="n">mongocxx</span><span class="o">::</span><span class="n">exception</span><span class="o">&amp;</span> <span class="n">e</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;An exception occurred: &quot;</span> <span class="o">&lt;&lt;</span> <span class="n">e</span><span class="p">.</span><span class="n">what</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
    <span class="k">return</span> <span class="n">EXIT_FAILURE</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">return</span> <span class="n">EXIT_SUCCESS</span><span class="p">;</span>
</pre></div>
</div>
</div>
</div>
<div class="tabpanel-csharp" data-tabid="csharp"><p>The example uses the new callback API for working with
transactions, which starts a transaction, executes the
specified operations, and commits (or aborts on error). The
new callback API also incorporates retry logic for
<code class="docutils literal"><span class="pre">TransientTransactionError</span></code> or
<code class="docutils literal"><span class="pre">UnknownTransactionCommitResult</span></code> commit errors.</p>
<div class="admonition important">
<p class="first admonition-title">Important</p>
<ul class="last simple">
<li>For transactions on MongoDB 4.2 deployments (replica
sets and sharded clusters), clients <strong class="text-danger">must</strong> use
MongoDB drivers updated for MongoDB 4.2.</li>
<li>When using the drivers, each operation in the
transaction must be associated with the session (i.e.
pass in the session to each operation).</li>
</ul>
</div>
<div class="button-code-block">
<div class="button-row">
<a class="code-button--copy code-button" role="button">
copy</a>
</div>
<div class="copyable-code-block highlight-c#"><div class="highlight"><pre><span></span><span class="c1">// For a replica set, include the replica set name and a seedlist of the members in the URI string; e.g.</span>
<span class="c1">// string uri = &quot;mongodb://mongodb0.example.com:27017,mongodb1.example.com:27017/?replicaSet=myRepl&quot;;</span>
<span class="c1">// For a sharded cluster, connect to the mongos instances; e.g.</span>
<span class="c1">// string uri = &quot;mongodb://mongos0.example.com:27017,mongos1.example.com:27017/&quot;;</span>
<span class="kt">var</span> <span class="n">client</span> <span class="p">=</span> <span class="k">new</span> <span class="n">MongoClient</span><span class="p">(</span><span class="n">connectionString</span><span class="p">);</span>

<span class="c1">// Prereq: Create collections.</span>
<span class="kt">var</span> <span class="n">database1</span> <span class="p">=</span> <span class="n">client</span><span class="p">.</span><span class="n">GetDatabase</span><span class="p">(</span><span class="s">&quot;mydb1&quot;</span><span class="p">);</span>
<span class="kt">var</span> <span class="n">collection1</span> <span class="p">=</span> <span class="n">database1</span><span class="p">.</span><span class="n">GetCollection</span><span class="p">&lt;</span><span class="n">BsonDocument</span><span class="p">&gt;(</span><span class="s">&quot;foo&quot;</span><span class="p">).</span><span class="n">WithWriteConcern</span><span class="p">(</span><span class="n">WriteConcern</span><span class="p">.</span><span class="n">WMajority</span><span class="p">);</span>
<span class="n">collection1</span><span class="p">.</span><span class="n">InsertOne</span><span class="p">(</span><span class="k">new</span> <span class="n">BsonDocument</span><span class="p">(</span><span class="s">&quot;abc&quot;</span><span class="p">,</span> <span class="m">0</span><span class="p">));</span>

<span class="kt">var</span> <span class="n">database2</span> <span class="p">=</span> <span class="n">client</span><span class="p">.</span><span class="n">GetDatabase</span><span class="p">(</span><span class="s">&quot;mydb2&quot;</span><span class="p">);</span>
<span class="kt">var</span> <span class="n">collection2</span> <span class="p">=</span> <span class="n">database2</span><span class="p">.</span><span class="n">GetCollection</span><span class="p">&lt;</span><span class="n">BsonDocument</span><span class="p">&gt;(</span><span class="s">&quot;bar&quot;</span><span class="p">).</span><span class="n">WithWriteConcern</span><span class="p">(</span><span class="n">WriteConcern</span><span class="p">.</span><span class="n">WMajority</span><span class="p">);</span>
<span class="n">collection2</span><span class="p">.</span><span class="n">InsertOne</span><span class="p">(</span><span class="k">new</span> <span class="n">BsonDocument</span><span class="p">(</span><span class="s">&quot;xyz&quot;</span><span class="p">,</span> <span class="m">0</span><span class="p">));</span>

<span class="c1">// Step 1: Start a client session.</span>
<span class="k">using</span> <span class="p">(</span><span class="kt">var</span> <span class="n">session</span> <span class="p">=</span> <span class="n">client</span><span class="p">.</span><span class="n">StartSession</span><span class="p">())</span>
<span class="p">{</span>
    <span class="c1">// Step 2: Optional. Define options to use for the transaction.</span>
    <span class="kt">var</span> <span class="n">transactionOptions</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TransactionOptions</span><span class="p">(</span>
        <span class="n">readPreference</span><span class="p">:</span> <span class="n">ReadPreference</span><span class="p">.</span><span class="n">Primary</span><span class="p">,</span>
        <span class="n">readConcern</span><span class="p">:</span> <span class="n">ReadConcern</span><span class="p">.</span><span class="n">Local</span><span class="p">,</span>
        <span class="n">writeConcern</span><span class="p">:</span> <span class="n">WriteConcern</span><span class="p">.</span><span class="n">WMajority</span><span class="p">);</span>

    <span class="c1">// Step 3: Define the sequence of operations to perform inside the transactions</span>
    <span class="kt">var</span> <span class="n">cancellationToken</span> <span class="p">=</span> <span class="n">CancellationToken</span><span class="p">.</span><span class="n">None</span><span class="p">;</span> <span class="c1">// normally a real token would be used</span>
    <span class="n">result</span> <span class="p">=</span> <span class="n">session</span><span class="p">.</span><span class="n">WithTransaction</span><span class="p">(</span>
        <span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">ct</span><span class="p">)</span> <span class="p">=&gt;</span>
        <span class="p">{</span>
            <span class="n">collection1</span><span class="p">.</span><span class="n">InsertOne</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="k">new</span> <span class="n">BsonDocument</span><span class="p">(</span><span class="s">&quot;abc&quot;</span><span class="p">,</span> <span class="m">1</span><span class="p">),</span> <span class="n">cancellationToken</span><span class="p">:</span> <span class="n">ct</span><span class="p">);</span>
            <span class="n">collection2</span><span class="p">.</span><span class="n">InsertOne</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="k">new</span> <span class="n">BsonDocument</span><span class="p">(</span><span class="s">&quot;xyz&quot;</span><span class="p">,</span> <span class="m">999</span><span class="p">),</span> <span class="n">cancellationToken</span><span class="p">:</span> <span class="n">ct</span><span class="p">);</span>
            <span class="k">return</span> <span class="s">&quot;Inserted into collections in different databases&quot;</span><span class="p">;</span>
        <span class="p">},</span>
        <span class="n">transactionOptions</span><span class="p">,</span>
        <span class="n">cancellationToken</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
    </div>
  </div>
</div><div class="admonition seealso">
<p class="first admonition-title">See also</p>
<p class="last">For an example in <a class="reference internal" href="../reference/program/mongo.html#bin.mongo" title="bin.mongo"><code class="xref mongodb mongodb-binary docutils literal"><span class="pre">mongo</span></code></a> shell, see <a class="reference internal" href="transactions-in-applications.html#txn-mongo-shell-example"><span class="std std-ref">mongo Shell Example</span></a>.</p>
</div>
</div>
<div class="section" id="transactions-and-atomicity">
<span id="transactions-atomicity"></span><h2>Transactions and Atomicity<a class="headerlink" href="#transactions-and-atomicity" title="Permalink to this headline">¶</a></h2>
<div class="topic">
<p class="topic-title first">Distributed Transactions and Multi-Document Transactions</p>
<p>Starting in MongoDB 4.2, the two terms are synonymous. Distributed
transactions refer to multi-document transactions on sharded
clusters and replica sets. Multi-document transactions (whether on
sharded clusters or replica sets) are also known as distributed
transactions starting in MongoDB 4.2.</p>
</div>
<p>For situations that require atomicity of reads and writes to multiple
documents (in a single or multiple collections), MongoDB supports
multi-document transactions:</p>
<ul>
<li><p class="first"><strong>In version 4.0</strong>, MongoDB supports multi-document transactions on
replica sets.</p>
</li>
<li><p class="first"><strong>In version 4.2</strong>, MongoDB introduces distributed transactions,
which adds support for multi-document transactions on sharded
clusters and incorporates the existing support for
multi-document transactions on replica sets.</p>
<p>To use transactions on MongoDB 4.2 deployments(replica sets and
sharded clusters), clients <strong class="text-danger">must</strong> use MongoDB drivers updated for
MongoDB 4.2.</p>
</li>
</ul>
<p>Multi-document transactions are atomic (i.e. provide an
“all-or-nothing” proposition):</p>
<ul>
<li><p class="first">When a transaction commits, all data changes made in the transaction
are saved and visible outside the transaction. That is, a transaction
will not commit some of its changes while rolling back others.</p>
<p>Until a transaction commits, the data changes made in the
transaction are not visible outside the transaction.</p>
<p>However, when a transaction writes to multiple shards, not all
outside read operations need to wait for the result of the committed
transaction to be visible across the shards. For example, if a
transaction is committed and write 1 is visible on shard A but write
2 is not yet visible on shard B, an outside read at read concern
<a class="reference internal" href="../reference/read-concern-local.html#readconcern.&quot;local&quot;" title="&quot;local&quot;"><code class="xref mongodb mongodb-readconcern docutils literal"><span class="pre">&quot;local&quot;</span></code></a> can read the results of write 1 without
seeing write 2.</p>
</li>
<li><p class="first">When a transaction aborts, all data changes made in the transaction
are discarded without ever becoming visible. For example, if any
operation in the transaction fails, the transaction aborts and all
data changes made in the transaction are discarded without ever
becoming visible.</p>
</li>
</ul>
<div class="admonition important">
<p class="first admonition-title">Important</p>
<p>In most cases, multi-document transaction incurs a greater
performance cost over single document writes, and the
availability of multi-document transactions should not be a
replacement for effective schema design. For many scenarios, the
<a class="reference internal" href="data-model-design.html#data-modeling-embedding"><span class="std std-ref">denormalized data model (embedded documents and arrays)</span></a> will continue to be optimal for your
data and use cases. That is, for many scenarios, modeling your data
appropriately will minimize the need for multi-document
transactions.</p>
<p class="last">For additional transactions usage considerations
(such as runtime limit and oplog size limit), see also
<a class="reference internal" href="transactions-production-consideration.html"><span class="doc">Production Considerations</span></a>.</p>
</div>
<div class="admonition seealso">
<p class="first admonition-title">See also</p>
<p class="last"><a class="reference internal" href="transactions-production-consideration.html#transactions-prod-consideration-outside-reads"><span class="std std-ref">Outside Reads During Commit</span></a></p>
</div>
</div>
<div class="section" id="transactions-and-operations">
<span id="transactions-operations"></span><h2>Transactions and Operations<a class="headerlink" href="#transactions-and-operations" title="Permalink to this headline">¶</a></h2>
<p>Distributed transactions can be used across multiple operations,
collections, databases, documents, and, starting in MongoDB 4.2, shards.</p>
<p>For transactions:</p>
<ul class="simple">
<li>You can specify read/write (CRUD) operations on <strong>existing</strong>
collections. The collections can be in different databases. For a
list of CRUD operations, see <a class="reference internal" href="transactions-operations.html#transactions-operations-crud"><span class="std std-ref">CRUD Operations</span></a>.</li>
<li>You cannot write to <a class="reference internal" href="capped-collections.html"><span class="doc">capped</span></a>
collections. (Starting in MongoDB 4.2)</li>
<li>You cannot read/write to collections in the <code class="docutils literal"><span class="pre">config</span></code>, <code class="docutils literal"><span class="pre">admin</span></code>,
or <code class="docutils literal"><span class="pre">local</span></code> databases.</li>
<li>You cannot write to <code class="docutils literal"><span class="pre">system.*</span></code> collections.</li>
<li>You cannot return the supported operation’s query plan (i.e. <code class="docutils literal"><span class="pre">explain</span></code>).</li>
</ul>
<ul class="simple">
<li>For cursors created outside of a transaction, you cannot call
<a class="reference internal" href="../reference/command/getMore.html#dbcmd.getMore" title="getMore"><code class="xref mongodb mongodb-dbcommand docutils literal"><span class="pre">getMore</span></code></a> inside the transaction.</li>
<li>For cursors created in a transaction, you cannot call
<a class="reference internal" href="../reference/command/getMore.html#dbcmd.getMore" title="getMore"><code class="xref mongodb mongodb-dbcommand docutils literal"><span class="pre">getMore</span></code></a> outside the transaction.</li>
<li>Starting in MongoDB 4.2, you cannot specify <a class="reference internal" href="../reference/command/killCursors.html#dbcmd.killCursors" title="killCursors"><code class="xref mongodb mongodb-dbcommand docutils literal"><span class="pre">killCursors</span></code></a> as
the first operation in a <a class="reference internal" href="#"><span class="doc">transaction</span></a>.</li>
</ul>
<p>Operations that affect the database catalog, such as creating or
dropping a collection or an index, are not allowed in
transactions. For example, a transaction cannot include an insert
operation that would result in the creation of a new collection. See
<a class="reference internal" href="#transactions-ops-restricted"><span class="std std-ref">Restricted Operations</span></a>.</p>
<div class="admonition-tip admonition">
<p class="first admonition-title">Tip</p>
<p class="last">When creating or dropping a collection immediately before
starting a transaction, if the collection is accessed within the
transaction, issue the create or drop operation with write
concern <a class="reference internal" href="../reference/write-concern.html#writeconcern.&quot;majority&quot;" title="&quot;majority&quot;"><code class="xref mongodb mongodb-writeconcern docutils literal"><span class="pre">&quot;majority&quot;</span></code></a> to ensure that the transaction
can acquire the required locks.</p>
</div>
<div class="admonition seealso">
<p class="first admonition-title">See also</p>
<ul class="last simple">
<li><a class="reference internal" href="transactions-operations.html"><span class="doc">Transactions and Operations Reference</span></a></li>
</ul>
</div>
<div class="section" id="count-operation">
<span id="transactions-ops-count"></span><h3>Count Operation<a class="headerlink" href="#count-operation" title="Permalink to this headline">¶</a></h3>
<div class="docutils container">
<p>To perform a count operation within a transaction, use the
<a class="reference internal" href="../reference/operator/aggregation/count.html#pipe._S_count" title="$count"><code class="xref mongodb mongodb-pipeline docutils literal"><span class="pre">$count</span></code></a> aggregation stage or the <a class="reference internal" href="../reference/operator/aggregation/group.html#pipe._S_group" title="$group"><code class="xref mongodb mongodb-pipeline docutils literal"><span class="pre">$group</span></code></a> (with a
<a class="reference internal" href="../reference/operator/aggregation/sum.html#grp._S_sum" title="$sum"><code class="xref mongodb mongodb-group docutils literal"><span class="pre">$sum</span></code></a> expression) aggregation stage.</p>
<p>MongoDB drivers compatible with the 4.0 features provide a
collection-level API <code class="docutils literal"><span class="pre">countDocuments(filter,</span> <span class="pre">options)</span></code> as a helper
method that uses the <a class="reference internal" href="../reference/operator/aggregation/group.html#pipe._S_group" title="$group"><code class="xref mongodb mongodb-pipeline docutils literal"><span class="pre">$group</span></code></a> with a <a class="reference internal" href="../reference/operator/aggregation/sum.html#grp._S_sum" title="$sum"><code class="xref mongodb mongodb-group docutils literal"><span class="pre">$sum</span></code></a> expression
to perform a count. The 4.0 drivers have deprecated the <code class="docutils literal"><span class="pre">count()</span></code> API.</p>
<p>Starting in MongoDB 4.0.3, the <a class="reference internal" href="../reference/program/mongo.html#bin.mongo" title="bin.mongo"><code class="xref mongodb mongodb-binary docutils literal"><span class="pre">mongo</span></code></a> shell provides the
<a class="reference internal" href="../reference/method/db.collection.countDocuments.html#db.collection.countDocuments" title="db.collection.countDocuments()"><code class="xref mongodb mongodb-method docutils literal"><span class="pre">db.collection.countDocuments()</span></code></a> helper method that uses the
<a class="reference internal" href="../reference/operator/aggregation/group.html#pipe._S_group" title="$group"><code class="xref mongodb mongodb-pipeline docutils literal"><span class="pre">$group</span></code></a> with a <a class="reference internal" href="../reference/operator/aggregation/sum.html#grp._S_sum" title="$sum"><code class="xref mongodb mongodb-group docutils literal"><span class="pre">$sum</span></code></a> expression to perform a count.</p>
</div>
</div>
<div class="section" id="distinct-operation">
<span id="transactions-ops-distinct"></span><h3>Distinct Operation<a class="headerlink" href="#distinct-operation" title="Permalink to this headline">¶</a></h3>
<div class="docutils container">
<p>To perform a distinct operation within a transaction:</p>
<ul>
<li><p class="first">For unsharded collections, you can use the
<a class="reference internal" href="../reference/method/db.collection.distinct.html#db.collection.distinct" title="db.collection.distinct()"><code class="xref mongodb mongodb-method docutils literal"><span class="pre">db.collection.distinct()</span></code></a> method/the
<a class="reference internal" href="../reference/command/distinct.html#dbcmd.distinct" title="distinct"><code class="xref mongodb mongodb-dbcommand docutils literal"><span class="pre">distinct</span></code></a> command as well as the aggregation pipeline
with the <a class="reference internal" href="../reference/operator/aggregation/group.html#pipe._S_group" title="$group"><code class="xref mongodb mongodb-pipeline docutils literal"><span class="pre">$group</span></code></a> stage.</p>
</li>
<li><p class="first">For sharded collections, you cannot use the
<a class="reference internal" href="../reference/method/db.collection.distinct.html#db.collection.distinct" title="db.collection.distinct()"><code class="xref mongodb mongodb-method docutils literal"><span class="pre">db.collection.distinct()</span></code></a> method or the
<a class="reference internal" href="../reference/command/distinct.html#dbcmd.distinct" title="distinct"><code class="xref mongodb mongodb-dbcommand docutils literal"><span class="pre">distinct</span></code></a> command.</p>
<p>To find the distinct values for a sharded collection, use the
aggregation pipeline with the <a class="reference internal" href="../reference/operator/aggregation/group.html#pipe._S_group" title="$group"><code class="xref mongodb mongodb-pipeline docutils literal"><span class="pre">$group</span></code></a> stage instead.
For example:</p>
<ul>
<li><p class="first">Instead of <code class="docutils literal"><span class="pre">db.coll.distinct(&quot;x&quot;)</span></code>, use</p>
<div class="button-code-block">
<div class="button-row">
<a class="code-button--copy code-button" role="button">
copy</a>
</div>
<div class="copyable-code-block highlight-javascript"><div class="highlight"><pre><span></span><span class="nx">db</span><span class="p">.</span><span class="nx">coll</span><span class="p">.</span><span class="nx">aggregate</span><span class="p">([</span>
   <span class="p">{</span> <span class="nx">$group</span><span class="o">:</span> <span class="p">{</span> <span class="nx">_id</span><span class="o">:</span> <span class="kc">null</span><span class="p">,</span> <span class="nx">distinctValues</span><span class="o">:</span> <span class="p">{</span> <span class="nx">$addToSet</span><span class="o">:</span> <span class="s2">&quot;$x&quot;</span> <span class="p">}</span> <span class="p">}</span> <span class="p">},</span>
   <span class="p">{</span> <span class="nx">$project</span><span class="o">:</span> <span class="p">{</span> <span class="nx">_id</span><span class="o">:</span> <span class="mi">0</span> <span class="p">}</span> <span class="p">}</span>
<span class="p">])</span>
</pre></div>
</div>
</div>
</li>
<li><p class="first">Instead of <code class="docutils literal"><span class="pre">db.coll.distinct(&quot;x&quot;,</span> <span class="pre">{</span> <span class="pre">status:</span> <span class="pre">&quot;A&quot;</span> <span class="pre">})</span></code>, use:</p>
<div class="button-code-block">
<div class="button-row">
<a class="code-button--copy code-button" role="button">
copy</a>
</div>
<div class="copyable-code-block highlight-javascript"><div class="highlight"><pre><span></span><span class="nx">db</span><span class="p">.</span><span class="nx">coll</span><span class="p">.</span><span class="nx">aggregate</span><span class="p">([</span>
   <span class="p">{</span> <span class="nx">$match</span><span class="o">:</span> <span class="p">{</span> <span class="nx">status</span><span class="o">:</span> <span class="s2">&quot;A&quot;</span> <span class="p">}</span> <span class="p">},</span>
   <span class="p">{</span> <span class="nx">$group</span><span class="o">:</span> <span class="p">{</span> <span class="nx">_id</span><span class="o">:</span> <span class="kc">null</span><span class="p">,</span> <span class="nx">distinctValues</span><span class="o">:</span> <span class="p">{</span> <span class="nx">$addToSet</span><span class="o">:</span> <span class="s2">&quot;$x&quot;</span> <span class="p">}</span> <span class="p">}</span> <span class="p">},</span>
   <span class="p">{</span> <span class="nx">$project</span><span class="o">:</span> <span class="p">{</span> <span class="nx">_id</span><span class="o">:</span> <span class="mi">0</span> <span class="p">}</span> <span class="p">}</span>
<span class="p">])</span>
</pre></div>
</div>
</div>
</li>
</ul>
<p>The pipeline returns a cursor to a document:</p>
<div class="button-code-block">
<div class="button-row">
</div>
<div class="highlight-javascript"><div class="highlight"><pre><span></span><span class="p">{</span> <span class="s2">&quot;distinctValues&quot;</span> <span class="o">:</span> <span class="p">[</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">1</span> <span class="p">]</span> <span class="p">}</span>
</pre></div>
</div>
</div>
<p>Iterate the cursor to access the results document.</p>
</li>
</ul>
</div>
</div>
<div class="section" id="informational-operations">
<span id="transactions-ops-info"></span><h3>Informational Operations<a class="headerlink" href="#informational-operations" title="Permalink to this headline">¶</a></h3>
<p>Informational commands, such as <a class="reference internal" href="../reference/command/isMaster.html#dbcmd.isMaster" title="isMaster"><code class="xref mongodb mongodb-dbcommand docutils literal"><span class="pre">isMaster</span></code></a>,
<a class="reference internal" href="../reference/command/buildInfo.html#dbcmd.buildInfo" title="buildInfo"><code class="xref mongodb mongodb-dbcommand docutils literal"><span class="pre">buildInfo</span></code></a>, <a class="reference internal" href="../reference/command/connectionStatus.html#dbcmd.connectionStatus" title="connectionStatus"><code class="xref mongodb mongodb-dbcommand docutils literal"><span class="pre">connectionStatus</span></code></a> (and their
helper methods) are allowed in transactions; however, they cannot be
the first operation in the transaction.</p>
</div>
<div class="section" id="restricted-operations">
<span id="transactions-ops-restricted"></span><h3>Restricted Operations<a class="headerlink" href="#restricted-operations" title="Permalink to this headline">¶</a></h3>
<p>The following operations are not allowed in transactions:</p>
<ul>
<li><p class="first">Operations that affect the database catalog, such as creating or
dropping a collection or an index. For example, a
transaction cannot include an insert operation that would result
in the creation of a new collection.</p>
<p>The <a class="reference internal" href="../reference/command/listCollections.html#dbcmd.listCollections" title="listCollections"><code class="xref mongodb mongodb-dbcommand docutils literal"><span class="pre">listCollections</span></code></a> and <a class="reference internal" href="../reference/command/listIndexes.html#dbcmd.listIndexes" title="listIndexes"><code class="xref mongodb mongodb-dbcommand docutils literal"><span class="pre">listIndexes</span></code></a>
commands and their helper methods are also excluded.</p>
</li>
<li><p class="first">Non-CRUD and non-informational operations, such as
<a class="reference internal" href="../reference/command/createUser.html#dbcmd.createUser" title="createUser"><code class="xref mongodb mongodb-dbcommand docutils literal"><span class="pre">createUser</span></code></a>, <a class="reference internal" href="../reference/command/getParameter.html#dbcmd.getParameter" title="getParameter"><code class="xref mongodb mongodb-dbcommand docutils literal"><span class="pre">getParameter</span></code></a>,
<a class="reference internal" href="../reference/command/count.html#dbcmd.count" title="count"><code class="xref mongodb mongodb-dbcommand docutils literal"><span class="pre">count</span></code></a>, etc. and their helpers.</p>
</li>
</ul>
<div class="admonition seealso">
<p class="first admonition-title">See also</p>
<ul class="last simple">
<li><a class="reference internal" href="transactions-production-consideration.html#txn-prod-considerations-ddl"><span class="std std-ref">Pending DDL Operations and Transactions</span></a></li>
<li><a class="reference internal" href="transactions-operations.html"><span class="doc">Transactions and Operations Reference</span></a></li>
</ul>
</div>
</div>
</div>
<div class="section" id="transactions-and-sessions">
<h2>Transactions and Sessions<a class="headerlink" href="#transactions-and-sessions" title="Permalink to this headline">¶</a></h2>
<ul class="simple">
<li>Transactions are associated with a session; i.e. you start a
transaction for a session.</li>
<li>At any given time, you can have at most one open transaction for a
session.</li>
<li>When using the drivers, each operation in the transaction must be
associated with the session. Refer to your driver specific
documentation for details.</li>
<li>If a session ends and it has an open transaction, the transaction
aborts.</li>
</ul>
</div>
<div class="section" id="read-concern-write-concern-read-preference">
<span id="transaction-options"></span><h2>Read Concern/Write Concern/Read Preference<a class="headerlink" href="#read-concern-write-concern-read-preference" title="Permalink to this headline">¶</a></h2>
<div class="section" id="transactions-and-read-preference">
<span id="transactions-read-preference"></span><h3>Transactions and Read Preference<a class="headerlink" href="#transactions-and-read-preference" title="Permalink to this headline">¶</a></h3>
<p>Operations in a transaction use the transaction-level <a class="reference internal" href="read-preference.html#replica-set-read-preference"><span class="std std-ref">read
preference</span></a>.</p>
<p>Using the drivers, you can set the transaction-level <a class="reference internal" href="read-preference.html#replica-set-read-preference"><span class="std std-ref">read
preference</span></a> at the transaction start:</p>
<ul class="simple">
<li>If the transaction-level read preference is unset, the transaction
uses the session-level read preference.</li>
<li>If transaction-level and the session-level read preference are unset,
the transaction uses the client-level read preference. By default,
the client-level read preference is <a class="reference internal" href="read-preference.html#primary" title="primary"><code class="xref mongodb mongodb-readmode docutils literal"><span class="pre">primary</span></code></a>.</li>
</ul>
<p><a class="reference internal" href="#"><span class="doc">Multi-document transactions</span></a> that contain
read operations must use read preference <a class="reference internal" href="read-preference.html#primary" title="primary"><code class="xref mongodb mongodb-readmode docutils literal"><span class="pre">primary</span></code></a>. All
operations in a given transaction must route to the same member.</p>
</div>
<div class="section" id="transactions-and-read-concern">
<span id="transactions-read-concern"></span><h3>Transactions and Read Concern<a class="headerlink" href="#transactions-and-read-concern" title="Permalink to this headline">¶</a></h3>
<p>Operations in a transaction use the transaction-level <a class="reference internal" href="../reference/read-concern.html"><span class="doc">read
concern</span></a>. That is, any read concern set at
the collection and database level is ignored inside the transaction.</p>
<p>You can set the transaction-level <a class="reference internal" href="../reference/read-concern.html"><span class="doc">read concern</span></a> at the transaction start.</p>
<ul class="simple">
<li>If the transaction-level read concern is unset, the transaction-level
read concern defaults to the session-level read concern.</li>
<li>If transaction-level and the session-level read concern are unset,
the transaction-level read concern defaults to the client-level read
concern. By default, client-level read concern is
<a class="reference internal" href="../reference/read-concern-local.html#readconcern.&quot;local&quot;" title="&quot;local&quot;"><code class="xref mongodb mongodb-readconcern docutils literal"><span class="pre">&quot;local&quot;</span></code></a> for reads against the primary. See also
<a class="reference internal" href="#transactions-read-preference"><span class="std std-ref">Transactions and Read Preference</span></a>.</li>
</ul>
<p>Transactions support the following read concern levels:</p>
<div class="section" id="local">
<h4><code class="docutils literal"><span class="pre">&quot;local&quot;</span></code><a class="headerlink" href="#local" title="Permalink to this headline">¶</a></h4>
<div class="docutils container">
<ul class="simple">
<li>Read concern <a class="reference internal" href="../reference/read-concern-local.html#readconcern.&quot;local&quot;" title="&quot;local&quot;"><code class="xref mongodb mongodb-readconcern docutils literal"><span class="pre">&quot;local&quot;</span></code></a> returns the most recent data
available from the node but can be rolled back.</li>
<li>For transactions on sharded cluster, <a class="reference internal" href="../reference/read-concern-local.html#readconcern.&quot;local&quot;" title="&quot;local&quot;"><code class="xref mongodb mongodb-readconcern docutils literal"><span class="pre">&quot;local&quot;</span></code></a> read
concern cannot guarantee that the data is from the same snapshot
view across the shards. If snapshot isolation is required, use
<a class="reference internal" href="#transactions-read-concern-snapshot"><span class="std std-ref">&quot;snapshot&quot;</span></a> read concern.</li>
</ul>
</div>
</div>
<div class="section" id="majority">
<h4><code class="docutils literal"><span class="pre">&quot;majority&quot;</span></code><a class="headerlink" href="#majority" title="Permalink to this headline">¶</a></h4>
<div class="docutils container">
<ul class="simple">
<li>Read concern <a class="reference internal" href="../reference/read-concern-majority.html#readconcern.&quot;majority&quot;" title="&quot;majority&quot;"><code class="xref mongodb mongodb-readconcern docutils literal"><span class="pre">&quot;majority&quot;</span></code></a> returns data that has been
acknowledged by a majority of the replica set members (i.e. data
cannot be rolled back) <strong>if</strong> the transaction commits with
<a class="reference internal" href="#transactions-write-concern"><span class="std std-ref">write concern “majority”</span></a>.</li>
<li>If the transaction does not use <a class="reference internal" href="#transactions-write-concern"><span class="std std-ref">write concern “majority”</span></a> for the commit, the
<a class="reference internal" href="../reference/read-concern-majority.html#readconcern.&quot;majority&quot;" title="&quot;majority&quot;"><code class="xref mongodb mongodb-readconcern docutils literal"><span class="pre">&quot;majority&quot;</span></code></a> read concern provides <strong>no</strong> guarantees that
read operations read majority-committed data.</li>
<li>For transactions on sharded cluster, <a class="reference internal" href="../reference/read-concern-majority.html#readconcern.&quot;majority&quot;" title="&quot;majority&quot;"><code class="xref mongodb mongodb-readconcern docutils literal"><span class="pre">&quot;majority&quot;</span></code></a> read
concern cannot guarantee that the data is from the same snapshot
view across the shards. If snapshot isolation is required, use
<a class="reference internal" href="#transactions-read-concern-snapshot"><span class="std std-ref">&quot;snapshot&quot;</span></a> read concern.</li>
</ul>
</div>
</div>
<div class="section" id="snapshot">
<span id="transactions-read-concern-snapshot"></span><h4><code class="docutils literal"><span class="pre">&quot;snapshot&quot;</span></code><a class="headerlink" href="#snapshot" title="Permalink to this headline">¶</a></h4>
<div class="docutils container">
<ul class="simple">
<li>Read concern <a class="reference internal" href="../reference/read-concern-snapshot.html#readconcern.&quot;snapshot&quot;" title="&quot;snapshot&quot;"><code class="xref mongodb mongodb-readconcern docutils literal"><span class="pre">&quot;snapshot&quot;</span></code></a> returns data from a
snapshot of majority committed data <strong>if</strong> the transaction commits
with <a class="reference internal" href="#transactions-write-concern"><span class="std std-ref">write concern “majority”</span></a>.</li>
<li>If the transaction does not use <a class="reference internal" href="#transactions-write-concern"><span class="std std-ref">write concern “majority”</span></a> for the commit, the
<a class="reference internal" href="../reference/read-concern-snapshot.html#readconcern.&quot;snapshot&quot;" title="&quot;snapshot&quot;"><code class="xref mongodb mongodb-readconcern docutils literal"><span class="pre">&quot;snapshot&quot;</span></code></a> read concern provides <strong>no</strong> guarantee that
read operations used a snapshot of majority-committed data.</li>
<li>For transactions on sharded clusters, the
<a class="reference internal" href="../reference/read-concern-snapshot.html#readconcern.&quot;snapshot&quot;" title="&quot;snapshot&quot;"><code class="xref mongodb mongodb-readconcern docutils literal"><span class="pre">&quot;snapshot&quot;</span></code></a> view of the data <strong>is</strong> synchronized
across shards.</li>
</ul>
</div>
</div>
</div>
<div class="section" id="transactions-and-write-concern">
<span id="transactions-write-concern"></span><h3>Transactions and Write Concern<a class="headerlink" href="#transactions-and-write-concern" title="Permalink to this headline">¶</a></h3>
<p>Transactions use the transaction-level <a class="reference internal" href="../reference/write-concern.html"><span class="doc">write concern</span></a> to commit the write operations. Write
operations inside transactions must be issued without explicit write
concern specification and use the default write concern. At commit
time, the writes are then commited using the transaction-level write
concern.</p>
<div class="admonition-tip admonition">
<p class="first admonition-title">Tip</p>
<p class="last">Do not explicitly set the write concern for the individual write
operations inside a transaction. Setting write concerns for the
individual write operations inside a transaction results in an error.</p>
</div>
<p>You can set the transaction-level <a class="reference internal" href="../reference/write-concern.html"><span class="doc">write concern</span></a> at the transaction start:</p>
<ul class="simple">
<li>If the transaction-level write concern is unset, the
transaction-level write concern defaults to the session-level write
concern for the commit.</li>
<li>If the transaction-level write concern and the session-level write
concern are unset, transaction-level write concern defaults to the
client-level write concern. By default, client-level write concern
is <a class="reference internal" href="../reference/write-concern.html#writeconcern.&lt;number&gt;" title="&lt;number&gt;"><code class="xref mongodb mongodb-writeconcern docutils literal"><span class="pre">w:</span> <span class="pre">1</span></code></a>.</li>
</ul>
<p>Transactions support all write concern <a class="reference internal" href="../reference/write-concern.html#wc-w"><span class="std std-ref">w</span></a>
values, including:</p>
<div class="section" id="w-1">
<h4><code class="docutils literal"><span class="pre">w:</span> <span class="pre">1</span></code><a class="headerlink" href="#w-1" title="Permalink to this headline">¶</a></h4>
<div class="docutils container">
<ul>
<li><p class="first">Write concern <a class="reference internal" href="../reference/write-concern.html#writeconcern.&lt;number&gt;" title="&lt;number&gt;"><code class="xref mongodb mongodb-writeconcern docutils literal"><span class="pre">w:</span> <span class="pre">1</span></code></a> returns
acknowledgement after the commit has been applied to the primary.</p>
<div class="admonition important">
<p class="first admonition-title">Important</p>
<p class="last">When you commit with <a class="reference internal" href="../reference/write-concern.html#writeconcern.&lt;number&gt;" title="&lt;number&gt;"><code class="xref mongodb mongodb-writeconcern docutils literal"><span class="pre">w:</span> <span class="pre">1</span></code></a>, your
transaction can be <a class="reference internal" href="replica-set-rollbacks.html"><span class="doc">rolled back if there is a failover</span></a>.</p>
</div>
</li>
<li><p class="first">When you commit with <a class="reference internal" href="../reference/write-concern.html#writeconcern.&lt;number&gt;" title="&lt;number&gt;"><code class="xref mongodb mongodb-writeconcern docutils literal"><span class="pre">w:</span> <span class="pre">1</span></code></a> write
concern, transaction-level <a class="reference internal" href="../reference/read-concern-majority.html#readconcern.&quot;majority&quot;" title="&quot;majority&quot;"><code class="xref mongodb mongodb-readconcern docutils literal"><span class="pre">&quot;majority&quot;</span></code></a> read concern
provides <strong>no</strong> guarantees that read operations in the transaction
read majority-committed data.</p>
</li>
<li><p class="first">When you commit with <a class="reference internal" href="../reference/write-concern.html#writeconcern.&lt;number&gt;" title="&lt;number&gt;"><code class="xref mongodb mongodb-writeconcern docutils literal"><span class="pre">w:</span> <span class="pre">1</span></code></a> write
concern, transaction-level <a class="reference internal" href="../reference/read-concern-snapshot.html#readconcern.&quot;snapshot&quot;" title="&quot;snapshot&quot;"><code class="xref mongodb mongodb-readconcern docutils literal"><span class="pre">&quot;snapshot&quot;</span></code></a> read concern
provides <strong>no</strong> guarantee that read operations in the transaction
used a snapshot of majority-committed data.</p>
</li>
</ul>
</div>
</div>
<div class="section" id="w-majority">
<h4><code class="docutils literal"><span class="pre">w:</span> <span class="pre">&quot;majority&quot;</span></code><a class="headerlink" href="#w-majority" title="Permalink to this headline">¶</a></h4>
<div class="docutils container">
<ul class="simple">
<li>Write concern <a class="reference internal" href="../reference/write-concern.html#writeconcern.&quot;majority&quot;" title="&quot;majority&quot;"><code class="xref mongodb mongodb-writeconcern docutils literal"><span class="pre">w:</span> <span class="pre">&quot;majority&quot;</span></code></a> returns
acknowledgement after the commit has been applied to a majority
(M) of voting members; i.e. the commit has been applied to the
primary and (M-1) voting secondaries.</li>
<li>When you commit with <a class="reference internal" href="../reference/write-concern.html#writeconcern.&quot;majority&quot;" title="&quot;majority&quot;"><code class="xref mongodb mongodb-writeconcern docutils literal"><span class="pre">w:</span> <span class="pre">&quot;majority&quot;</span></code></a>
write concern, transaction-level <a class="reference internal" href="../reference/read-concern-majority.html#readconcern.&quot;majority&quot;" title="&quot;majority&quot;"><code class="xref mongodb mongodb-readconcern docutils literal"><span class="pre">&quot;majority&quot;</span></code></a> read
concern guarantees that operations have read majority-committed
data. For transactions on sharded clusters, this view of the
majority-committed data is not synchronized across shards.</li>
<li>When you commit with <a class="reference internal" href="../reference/write-concern.html#writeconcern.&quot;majority&quot;" title="&quot;majority&quot;"><code class="xref mongodb mongodb-writeconcern docutils literal"><span class="pre">w:</span> <span class="pre">&quot;majority&quot;</span></code></a>
write concern, transaction-level <a class="reference internal" href="../reference/read-concern-snapshot.html#readconcern.&quot;snapshot&quot;" title="&quot;snapshot&quot;"><code class="xref mongodb mongodb-readconcern docutils literal"><span class="pre">&quot;snapshot&quot;</span></code></a> read
concern guarantees that operations have from a synchronized
snapshot of majority-committed data.</li>
</ul>
</div>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Regardless of the <a class="reference internal" href="#transactions-write-concern"><span class="std std-ref">write concern specified for the
transaction</span></a>, the commit operation for a
sharded cluster transaction includes some parts that use <code class="docutils literal"><span class="pre">{w:</span>
<span class="pre">&quot;majority&quot;,</span> <span class="pre">j:</span> <span class="pre">true}</span></code> write concern.</p>
</div>
</div>
</div>
</div>
<div class="section" id="general-information">
<h2>General Information<a class="headerlink" href="#general-information" title="Permalink to this headline">¶</a></h2>
<div class="section" id="production-considerations">
<h3>Production Considerations<a class="headerlink" href="#production-considerations" title="Permalink to this headline">¶</a></h3>
<p>For various production considerations with using transactions, see
<a class="reference internal" href="transactions-production-consideration.html"><span class="doc">Production Considerations</span></a>. In addition, or sharded
clusters, see also <a class="reference internal" href="transactions-sharded-clusters.html"><span class="doc">Production Considerations (Sharded Clusters)</span></a>.</p>
</div>
<div class="section" id="arbiters">
<h3>Arbiters<a class="headerlink" href="#arbiters" title="Permalink to this headline">¶</a></h3>
<p>Transactions whose write operations span multiple shards will error
and abort if any transaction operation reads from or writes to a
shard that contains an arbiter.</p>
<p>See also <a class="reference internal" href="#transactions-disabled-rc-majority"><span class="std std-ref">Disabled Read Concern Majority</span></a> for transaction restrictions on shards that
have disabled read concern majority.</p>
</div>
<div class="section" id="disabled-read-concern-majority">
<span id="transactions-disabled-rc-majority"></span><h3>Disabled Read Concern Majority<a class="headerlink" href="#disabled-read-concern-majority" title="Permalink to this headline">¶</a></h3>
<p>A 3-member PSA (Primary-Secondary-Arbiter) replica set or a sharded
cluster with 3-member PSA shards may have disabled read concern
majority (<a class="reference internal" href="../reference/program/mongod.html#cmdoption-mongod-enablemajorityreadconcern"><code class="xref std std-option docutils literal"><span class="pre">--enableMajorityReadConcern</span> <span class="pre">false</span></code></a> or
<a class="reference internal" href="../reference/configuration-options.html#replication.enableMajorityReadConcern" title="replication.enableMajorityReadConcern"><code class="xref mongodb mongodb-setting docutils literal"><span class="pre">replication.enableMajorityReadConcern:</span> <span class="pre">false</span></code></a>)</p>
<dl class="docutils">
<dt>On sharded clusters,</dt>
<dd><ul class="first last">
<li><p class="first">If a transaction involves a shard that has <a class="reference internal" href="../reference/read-concern-majority.html#disable-read-concern-majority"><span class="std std-ref">disabled read
concern “majority”</span></a>, you cannot
use read concern <a class="reference internal" href="../reference/read-concern-snapshot.html#readconcern.&quot;snapshot&quot;" title="&quot;snapshot&quot;"><code class="xref mongodb mongodb-readconcern docutils literal"><span class="pre">&quot;snapshot&quot;</span></code></a> for the transaction.
You can only use read concern <a class="reference internal" href="../reference/read-concern-local.html#readconcern.&quot;local&quot;" title="&quot;local&quot;"><code class="xref mongodb mongodb-readconcern docutils literal"><span class="pre">&quot;local&quot;</span></code></a> or
<a class="reference internal" href="../reference/read-concern-majority.html#readconcern.&quot;majority&quot;" title="&quot;majority&quot;"><code class="xref mongodb mongodb-readconcern docutils literal"><span class="pre">&quot;majority&quot;</span></code></a> for the transaction. If you use read
concern <a class="reference internal" href="../reference/read-concern-snapshot.html#readconcern.&quot;snapshot&quot;" title="&quot;snapshot&quot;"><code class="xref mongodb mongodb-readconcern docutils literal"><span class="pre">&quot;snapshot&quot;</span></code></a>, the transaction errors and
aborts.</p>
<div class="button-code-block">
<div class="button-row">
</div>
<div class="highlight-none"><div class="highlight"><pre><span></span>readConcern level &#39;snapshot&#39; is not supported in sharded clusters when enableMajorityReadConcern=false.
</pre></div>
</div>
</div>
</li>
<li><p class="first">Transactions whose write operations span multiple shards will
error and abort if any of the transaction’s read or write
operations involves a shard that has disabled read concern
<code class="docutils literal"><span class="pre">&quot;majority&quot;</span></code>.</p>
</li>
</ul>
</dd>
</dl>
<dl class="docutils">
<dt>On replica set,</dt>
<dd><p class="first">You can specify read concern <a class="reference internal" href="../reference/read-concern-local.html#readconcern.&quot;local&quot;" title="&quot;local&quot;"><code class="xref mongodb mongodb-readconcern docutils literal"><span class="pre">&quot;local&quot;</span></code></a> or
<a class="reference internal" href="../reference/read-concern-majority.html#readconcern.&quot;majority&quot;" title="&quot;majority&quot;"><code class="xref mongodb mongodb-readconcern docutils literal"><span class="pre">&quot;majority&quot;</span></code></a> or <a class="reference internal" href="../reference/read-concern-snapshot.html#readconcern.&quot;snapshot&quot;" title="&quot;snapshot&quot;"><code class="xref mongodb mongodb-readconcern docutils literal"><span class="pre">&quot;snapshot&quot;</span></code></a> even in
the replica set has <a class="reference internal" href="../reference/read-concern-majority.html#disable-read-concern-majority"><span class="std std-ref">disabled read concern “majority”</span></a>.</p>
<p class="last">However, if you are planning to transition to a sharded cluster with
disabled read concern majority shards, you may wish to avoid using
read concern <code class="docutils literal"><span class="pre">&quot;snapshot&quot;</span></code>.</p>
</dd>
</dl>
<div class="admonition-tip admonition">
<p class="first admonition-title">Tip</p>
<p class="last">To check if read concern “majority” is disabled, You can run
<a class="reference internal" href="../reference/method/db.serverStatus.html#db.serverStatus" title="db.serverStatus()"><code class="xref mongodb mongodb-method docutils literal"><span class="pre">db.serverStatus()</span></code></a> on the <a class="reference internal" href="../reference/program/mongod.html#bin.mongod" title="bin.mongod"><code class="xref mongodb mongodb-binary docutils literal"><span class="pre">mongod</span></code></a> instances
and check the <a class="reference internal" href="../reference/command/serverStatus.html#serverstatus.storageEngine.supportsCommittedReads" title="storageEngine.supportsCommittedReads"><code class="xref mongodb mongodb-serverstatus docutils literal"><span class="pre">storageEngine.supportsCommittedReads</span></code></a>
field. If <code class="docutils literal"><span class="pre">false</span></code>, read concern “majority” is disabled.</p>
</div>
<p>For more information, see <a class="reference internal" href="transactions-production-consideration.html#transactions-psa"><span class="std std-ref">3-Member Primary-Secondary-Arbiter Architecture</span></a> and
<a class="reference internal" href="transactions-sharded-clusters.html#transactions-sharded-clusters-psa"><span class="std std-ref">Three Member Primary-Secondary-Arbiter Shards</span></a>.</p>
</div>
<div class="section" id="shard-configuration-restriction">
<span id="transactions-wcmajority-disabled"></span><h3>Shard Configuration Restriction<a class="headerlink" href="#shard-configuration-restriction" title="Permalink to this headline">¶</a></h3>
<p>You cannot run transactions on a sharded cluster that has a shard
with <a class="reference internal" href="../reference/replica-configuration.html#rsconf.writeConcernMajorityJournalDefault" title="writeConcernMajorityJournalDefault"><code class="xref mongodb mongodb-rsconf docutils literal"><span class="pre">writeConcernMajorityJournalDefault</span></code></a> set to <code class="docutils literal"><span class="pre">false</span></code>
(such as a shard with a voting member that uses the <a class="reference internal" href="inmemory.html"><span class="doc">in-memory
storage engine</span></a>).</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Regardless of the <a class="reference internal" href="#transactions-write-concern"><span class="std std-ref">write concern specified for the
transaction</span></a>, the commit operation for a
sharded cluster transaction includes some parts that use <code class="docutils literal"><span class="pre">{w:</span>
<span class="pre">&quot;majority&quot;,</span> <span class="pre">j:</span> <span class="pre">true}</span></code> write concern.</p>
</div>
</div>
<div class="section" id="diagnostics">
<h3>Diagnostics<a class="headerlink" href="#diagnostics" title="Permalink to this headline">¶</a></h3>
<p>MongoDB provides various transactions metrics:</p>
<table border="1" class="colwidths-given docutils">
<colgroup>
<col width="40%" />
<col width="60%" />
</colgroup>
<thead valign="bottom">
<tr class="row-odd"><th class="head">Via</th>
<th class="head">&#160;</th>
</tr>
</thead>
<tbody valign="top">
<tr class="row-even"><td><div class="first last line-block">
<div class="line"><a class="reference internal" href="../reference/method/db.serverStatus.html#db.serverStatus" title="db.serverStatus()"><code class="xref mongodb mongodb-method docutils literal"><span class="pre">db.serverStatus()</span></code></a> method</div>
<div class="line"><a class="reference internal" href="../reference/command/serverStatus.html#dbcmd.serverStatus" title="serverStatus"><code class="xref mongodb mongodb-dbcommand docutils literal"><span class="pre">serverStatus</span></code></a> command</div>
</div>
</td>
<td>Returns <a class="reference internal" href="../reference/command/serverStatus.html#server-status-transactions"><span class="std std-ref">transactions</span></a> metrics.</td>
</tr>
<tr class="row-odd"><td><a class="reference internal" href="../reference/operator/aggregation/currentOp.html#pipe._S_currentOp" title="$currentOp"><code class="xref mongodb mongodb-pipeline docutils literal"><span class="pre">$currentOp</span></code></a> aggregation pipeline</td>
<td><p class="first">Returns:</p>
<ul class="last simple">
<li><a class="reference internal" href="../reference/operator/aggregation/currentOp.html#_S_currentOp.transaction" title="$currentOp.transaction"><code class="xref mongodb mongodb-data docutils literal"><span class="pre">$currentOp.transaction</span></code></a> if an operation is part of a
transaction.</li>
<li>Information on <a class="reference internal" href="../reference/operator/aggregation/currentOp.html#currentop-stage-idlesessions"><span class="std std-ref">inactive sessions</span></a> that are holding locks as part
of a transaction.</li>
<li><a class="reference internal" href="../reference/operator/aggregation/currentOp.html#_S_currentOp.twoPhaseCommitCoordinator" title="$currentOp.twoPhaseCommitCoordinator"><code class="xref mongodb mongodb-data docutils literal"><span class="pre">$currentOp.twoPhaseCommitCoordinator</span></code></a> metrics for
sharded transactions that involes writes to multiple shards.</li>
</ul>
</td>
</tr>
<tr class="row-even"><td><div class="first last line-block">
<div class="line"><a class="reference internal" href="../reference/method/db.currentOp.html#db.currentOp" title="db.currentOp()"><code class="xref mongodb mongodb-method docutils literal"><span class="pre">db.currentOp()</span></code></a> method</div>
<div class="line"><a class="reference internal" href="../reference/command/currentOp.html#dbcmd.currentOp" title="currentOp"><code class="xref mongodb mongodb-dbcommand docutils literal"><span class="pre">currentOp</span></code></a> command</div>
</div>
</td>
<td><p class="first">Returns:</p>
<ul class="last simple">
<li><a class="reference internal" href="../reference/command/currentOp.html#currentOp.transaction" title="currentOp.transaction"><code class="xref mongodb mongodb-data docutils literal"><span class="pre">currentOp.transaction</span></code></a> if an operation is part of a
transaction.</li>
<li><a class="reference internal" href="../reference/command/currentOp.html#currentOp.twoPhaseCommitCoordinator" title="currentOp.twoPhaseCommitCoordinator"><code class="xref mongodb mongodb-data docutils literal"><span class="pre">currentOp.twoPhaseCommitCoordinator</span></code></a> metrics for
sharded transactions that involes writes to multiple shards.</li>
</ul>
</td>
</tr>
<tr class="row-odd"><td><a class="reference internal" href="../reference/program/mongod.html#bin.mongod" title="bin.mongod"><code class="xref mongodb mongodb-binary docutils literal"><span class="pre">mongod</span></code></a> and <a class="reference internal" href="../reference/program/mongos.html#bin.mongos" title="bin.mongos"><code class="xref mongodb mongodb-binary docutils literal"><span class="pre">mongos</span></code></a> log messages</td>
<td>Includes information on slow transactions (i.e. transactions
that exceed the <a class="reference internal" href="../reference/configuration-options.html#operationProfiling.slowOpThresholdMs" title="operationProfiling.slowOpThresholdMs"><code class="xref mongodb mongodb-setting docutils literal"><span class="pre">operationProfiling.slowOpThresholdMs</span></code></a>
threshhold) under the <a class="reference internal" href="../reference/log-messages.html#TXN" title="TXN"><code class="xref mongodb mongodb-data docutils literal"><span class="pre">TXN</span></code></a> log component.</td>
</tr>
</tbody>
</table>
</div>
<div class="section" id="feature-compatibility-version-fcv">
<span id="transactions-fcv"></span><h3>Feature Compatibility Version (FCV)<a class="headerlink" href="#feature-compatibility-version-fcv" title="Permalink to this headline">¶</a></h3>
<p>To use transactions, the <a class="reference internal" href="../reference/command/setFeatureCompatibilityVersion.html#view-fcv"><span class="std std-ref">featureCompatibilityVersion</span></a>
for all members of the deployment must be at least:</p>
<table border="1" class="docutils">
<colgroup>
<col width="50%" />
<col width="50%" />
</colgroup>
<thead valign="bottom">
<tr class="row-odd"><th class="head">Deployment</th>
<th class="head">Minimum <code class="docutils literal"><span class="pre">featureCompatibilityVersion</span></code></th>
</tr>
</thead>
<tbody valign="top">
<tr class="row-even"><td>Replica Set</td>
<td><code class="docutils literal"><span class="pre">4.0</span></code></td>
</tr>
<tr class="row-odd"><td>Sharded Cluster</td>
<td><code class="docutils literal"><span class="pre">4.2</span></code></td>
</tr>
</tbody>
</table>
<p>To check the fCV for a member, connect to the member and run the
following command:</p>
<div class="button-code-block">
<div class="button-row">
<a class="code-button--copy code-button" role="button">
copy</a>
</div>
<div class="copyable-code-block highlight-javascript"><div class="highlight"><pre><span></span><span class="nx">db</span><span class="p">.</span><span class="nx">adminCommand</span><span class="p">(</span> <span class="p">{</span> <span class="nx">getParameter</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">featureCompatibilityVersion</span><span class="o">:</span> <span class="mi">1</span> <span class="p">}</span> <span class="p">)</span>
</pre></div>
</div>
</div>
<p>For more information, see the
<a class="reference internal" href="../reference/command/setFeatureCompatibilityVersion.html#dbcmd.setFeatureCompatibilityVersion" title="setFeatureCompatibilityVersion"><code class="xref mongodb mongodb-dbcommand docutils literal"><span class="pre">setFeatureCompatibilityVersion</span></code></a> reference page.</p>
</div>
<div class="section" id="storage-engines">
<span id="transactions-storage-engines"></span><h3>Storage Engines<a class="headerlink" href="#storage-engines" title="Permalink to this headline">¶</a></h3>
<p>Starting in MongoDB 4.2, <a class="reference internal" href="#"><span class="doc">multi-document transactions</span></a> are supported on replica sets and sharded
clusters where:</p>
<ul class="simple">
<li>the primary uses the WiredTiger storage engine, and</li>
<li>the secondary members use either the WiredTiger storage engine or the
<a class="reference internal" href="inmemory.html"><span class="doc">in-memory</span></a> storage engines.</li>
</ul>
<p>In MongoDB 4.0, only replica sets using the WiredTiger storage
engine supported transactions.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">You cannot run transactions on a sharded cluster that has a shard
with <a class="reference internal" href="../reference/replica-configuration.html#rsconf.writeConcernMajorityJournalDefault" title="writeConcernMajorityJournalDefault"><code class="xref mongodb mongodb-rsconf docutils literal"><span class="pre">writeConcernMajorityJournalDefault</span></code></a> set to
<code class="docutils literal"><span class="pre">false</span></code>, such as a shard with a voting member that uses the
<a class="reference internal" href="inmemory.html"><span class="doc">in-memory storage engine</span></a>.</p>
</div>
</div>
</div>
<div class="section" id="additional-transactions-topics">
<h2>Additional Transactions Topics<a class="headerlink" href="#additional-transactions-topics" title="Permalink to this headline">¶</a></h2>
<ul class="simple">
<li><a class="reference internal" href="transactions-in-applications.html"><span class="doc">Drivers API</span></a></li>
<li><a class="reference internal" href="transactions-production-consideration.html"><span class="doc">Production Considerations</span></a></li>
<li><a class="reference internal" href="transactions-sharded-clusters.html"><span class="doc">Production Considerations (Sharded Clusters)</span></a></li>
<li><a class="reference internal" href="transactions-operations.html"><span class="doc">Transactions and Operations</span></a></li>
</ul>
<div class="toctree-wrapper compound">
</div>
</div>
</div>

                
    <div id="btnv">
      <span class="btn-arrow-left">&larr; &nbsp;</span>
      <a class="btn-prev-text" href="../reference/database-references.html" title="Previous Section: Database References"><span>Database References</span></a>
      <a class="btn-next-text" href="transactions-in-applications.html" title="Next Section: Drivers API"><span>Drivers API</span></a>
      <span class="btn-arrow-right">&nbsp;&rarr;</span>
    </div>
                  <div class="footer">
                    <div class="copyright">
                      <p>&copy; MongoDB, Inc 2008-present. MongoDB, Mongo, and the leaf logo are registered trademarks of MongoDB, Inc.</p>
                    </div>
                  </div>
              </div></div>
            </div>
        </div>
    </div>
    <div class="right-column">
      <div class="wrapper"> <div id='mongodb-docs-1'>
   <script type='text/javascript'>
      googletag.cmd.push(function() { googletag.display('mongodb-docs-1'); });
   </script>
</div>
            <div class="social">
               <a class="slack-icon" href="https://slackpass.io/mongo-db?jmp=docs" title="https://slackpass.io/mongo-db?jmp=docs"><i class="fab fa-slack" aria-hidden="true"></i></a>
               <a class="twitter-icon" href="https://twitter.com/MongoDB" title="https://twitter.com/MongoDB"><i class="fab fa-twitter-square"></i></a>
               <a class="youtube-icon" href="https://www.youtube.com/user/MongoDB" title="https://www.youtube.com/user/MongoDB"><i class="fab fa-youtube-square"></i></a>
               <a class="facebook-icon" href="https://www.facebook.com/mongodb" title="https://www.facebook.com/mongodb"><i class="fab fa-facebook-square"></i></a>
               <a class="stack-overflow-icon" href="https://stackoverflow.com/tags/mongodb/info" title="https://stackoverflow.com/tags/mongodb/info"><i class="fab fa-stack-overflow" aria-hidden="true"></i></a>
            </div>
        

      </div>
    </div>
    
      <div id="rating-panel"></div>
    
    <div class="clearfix"></div>
  </div>
  

  <script type="text/javascript">
  // Bootstrap array of links that should trigger a full page reload
  window.docsExcludedNav = ['/administration', '/administration/production-checklist', '/administration/indexes-management', '/aggregation', '/applications/geospatial-indexes', '/applications/indexes', '/contributors/getting-started', '/core/2d', '/core/2dsphere', '/core/auditing', '/core/authentication', '/core/authorization', '/core/backups', '/core/read-isolation-consistency-recency', '/core/databases-and-collections', '/core/geohaystack', '/core/index-single', '/core/index-compound', '/core/index-creation', '/core/index-hashed', '/core/index-multikey', '/core/index-partial', '/core/index-sparse', '/core/index-text', '/core/index-ttl', '/core/index-unique', '/core/index-wildcard', '/core/journaling', '/core/kerberos', '/core/map-reduce', '/core/operational-segregation', '/core/query-optimization', '/core/read-preference', '/core/replica-set-architectures', '/core/replica-set-high-availability', '/core/replica-set-members', '/core/replica-set-secondary', '/core/transactions', '/geospatial-queries', '/replication', '/core/sharded-cluster-components', '/core/wiredtiger', '/core/write-operations-atomicity', '/crud', '/indexes', '/installation', '/introduction', '/mongo', '/products/bi-connector', '/reference/command', '/reference/collation', '/text-search', '/tutorial/manage-the-database-profiler', '/core/index-text', '/reference/bson-types', '/reference/configuration-options', '/reference/indexes', '/reference/method', '/reference/operator/aggregation', '/reference/operator/query', '/reference/operator/query-modifier', '/reference/operator/update', '/reference/replication', '/reference/read-concern', '/reference/security', '/reference/sharding', '/reference/write-concern', '/release-notes/2.4', '/release-notes/2.6', '/release-notes/2.8', '/release-notes/3.0', '/release-notes/3.2', '/release-notes/3.4', '/release-notes/3.6', '/release-notes/4.0', '/release-notes/4.2', '/security', '/sharding', '/changeStreams', '/core/zone-sharding', '/core/hashed-sharding', '/core/ranged-sharding', '/storage', '/tutorial/change-sharded-cluster-wiredtiger', '/tutorial/insert-documents', '/tutorial/query-documents', '/tutorial/remove-documents', '/tutorial/update-documents', '/tutorial/enable-authentication', '/tutorial/install-mongodb-on-ubuntu', '/tutorial/install-mongodb-on-windows', '/tutorial/install-mongodb-on-red-hat', '/tutorial/install-mongodb-on-debian', '/tutorial/install-mongodb-on-suse', '/tutorial/install-mongodb-on-amazon', '/tutorial/install-mongodb-enterprise-on-ubuntu', '/tutorial/install-mongodb-enterprise-on-windows', '/tutorial/install-mongodb-enterprise-on-red-hat', '/tutorial/install-mongodb-enterprise-on-debian', '/tutorial/install-mongodb-enterprise-on-suse', '/tutorial/install-mongodb-enterprise-on-amazon', '/tutorial/install-mongodb-on-os-x'];
  </script></body>
</html>